19#ifdef LIBXML_SCHEMAS_ENABLED
45 "http://relaxng.org/ns/structure/1.0";
47#define IS_RELAXNG(node, typ) \
48 ((node != NULL) && (node->ns != NULL) && \
49 (node->type == XML_ELEMENT_NODE) && \
50 (xmlStrEqual(node->name, (const xmlChar *) typ)) && \
51 (xmlStrEqual(node->ns->href, xmlRelaxNGNs)))
57 xmlGenericError(xmlGenericErrorContext, \
58 "Unimplemented block at %s:%d\n", \
61typedef struct _xmlRelaxNGSchema xmlRelaxNGSchema;
62typedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr;
64typedef struct _xmlRelaxNGDefine xmlRelaxNGDefine;
65typedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr;
67typedef struct _xmlRelaxNGDocument xmlRelaxNGDocument;
68typedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr;
70typedef struct _xmlRelaxNGInclude xmlRelaxNGInclude;
71typedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr;
74 XML_RELAXNG_COMBINE_UNDEFINED = 0,
75 XML_RELAXNG_COMBINE_CHOICE,
76 XML_RELAXNG_COMBINE_INTERLEAVE
80 XML_RELAXNG_CONTENT_ERROR = -1,
81 XML_RELAXNG_CONTENT_EMPTY = 0,
82 XML_RELAXNG_CONTENT_SIMPLE,
83 XML_RELAXNG_CONTENT_COMPLEX
84} xmlRelaxNGContentType;
86typedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar;
87typedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr;
89struct _xmlRelaxNGGrammar {
90 xmlRelaxNGGrammarPtr
parent;
91 xmlRelaxNGGrammarPtr children;
92 xmlRelaxNGGrammarPtr
next;
93 xmlRelaxNGDefinePtr
start;
94 xmlRelaxNGCombine combine;
95 xmlRelaxNGDefinePtr startList;
102 XML_RELAXNG_NOOP = -1,
103 XML_RELAXNG_EMPTY = 0,
104 XML_RELAXNG_NOT_ALLOWED,
108 XML_RELAXNG_DATATYPE,
112 XML_RELAXNG_ATTRIBUTE,
115 XML_RELAXNG_EXTERNALREF,
116 XML_RELAXNG_PARENTREF,
117 XML_RELAXNG_OPTIONAL,
118 XML_RELAXNG_ZEROORMORE,
119 XML_RELAXNG_ONEORMORE,
122 XML_RELAXNG_INTERLEAVE,
126#define IS_NULLABLE (1 << 0)
127#define IS_NOT_NULLABLE (1 << 1)
128#define IS_INDETERMINIST (1 << 2)
129#define IS_MIXED (1 << 3)
130#define IS_TRIABLE (1 << 4)
131#define IS_PROCESSED (1 << 5)
132#define IS_COMPILABLE (1 << 6)
133#define IS_NOT_COMPILABLE (1 << 7)
134#define IS_EXTERNAL_REF (1 << 8)
136struct _xmlRelaxNGDefine {
144 xmlRelaxNGDefinePtr
parent;
145 xmlRelaxNGDefinePtr
next;
146 xmlRelaxNGDefinePtr attrs;
147 xmlRelaxNGDefinePtr nameClass;
148 xmlRelaxNGDefinePtr nextHash;
151 xmlRegexpPtr contModel;
161 xmlRelaxNGGrammarPtr topgrammar;
168 xmlRelaxNGDocumentPtr documents;
171 xmlRelaxNGDefinePtr *defTab;
175#define XML_RELAXNG_IN_ATTRIBUTE (1 << 0)
176#define XML_RELAXNG_IN_ONEORMORE (1 << 1)
177#define XML_RELAXNG_IN_LIST (1 << 2)
178#define XML_RELAXNG_IN_DATAEXCEPT (1 << 3)
179#define XML_RELAXNG_IN_START (1 << 4)
180#define XML_RELAXNG_IN_OOMGROUP (1 << 5)
181#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6)
182#define XML_RELAXNG_IN_EXTERNALREF (1 << 7)
183#define XML_RELAXNG_IN_ANYEXCEPT (1 << 8)
184#define XML_RELAXNG_IN_NSEXCEPT (1 << 9)
186struct _xmlRelaxNGParserCtxt {
188 xmlRelaxNGValidityErrorFunc
error;
189 xmlRelaxNGValidityWarningFunc
warning;
191 xmlRelaxNGValidErr
err;
194 xmlRelaxNGGrammarPtr grammar;
195 xmlRelaxNGGrammarPtr parentgrammar;
200 xmlRelaxNGDefinePtr def;
205 xmlRelaxNGDocumentPtr documents;
212 xmlRelaxNGDefinePtr *defTab;
218 xmlRelaxNGDocumentPtr doc;
221 xmlRelaxNGDocumentPtr *docTab;
224 xmlRelaxNGIncludePtr inc;
227 xmlRelaxNGIncludePtr *incTab;
233 xmlAutomataStatePtr
state;
239#define FLAGS_IGNORABLE 1
240#define FLAGS_NEGATIVE 2
241#define FLAGS_MIXED_CONTENT 4
242#define FLAGS_NOERROR 8
249typedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup;
250typedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr;
251struct _xmlRelaxNGInterleaveGroup {
252 xmlRelaxNGDefinePtr rule;
253 xmlRelaxNGDefinePtr *defs;
254 xmlRelaxNGDefinePtr *attrs;
257#define IS_DETERMINIST 1
258#define IS_NEEDCHECK 2
265typedef struct _xmlRelaxNGPartition xmlRelaxNGPartition;
266typedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr;
267struct _xmlRelaxNGPartition {
272 xmlRelaxNGInterleaveGroupPtr *
groups;
281typedef struct _xmlRelaxNGValidState xmlRelaxNGValidState;
282typedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr;
283struct _xmlRelaxNGValidState {
299typedef struct _xmlRelaxNGStates xmlRelaxNGStates;
300typedef xmlRelaxNGStates *xmlRelaxNGStatesPtr;
301struct _xmlRelaxNGStates {
304 xmlRelaxNGValidStatePtr *tabState;
307#define ERROR_IS_DUP 1
314typedef struct _xmlRelaxNGValidError xmlRelaxNGValidError;
315typedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr;
316struct _xmlRelaxNGValidError {
317 xmlRelaxNGValidErr
err;
331struct _xmlRelaxNGValidCtxt {
333 xmlRelaxNGValidityErrorFunc
error;
334 xmlRelaxNGValidityWarningFunc
warning;
349 xmlRelaxNGValidErrorPtr
err;
352 xmlRelaxNGValidErrorPtr errTab;
354 xmlRelaxNGValidStatePtr
state;
355 xmlRelaxNGStatesPtr states;
357 xmlRelaxNGStatesPtr freeState;
360 xmlRelaxNGStatesPtr *freeStates;
365 xmlRegExecCtxtPtr
elem;
368 xmlRegExecCtxtPtr *elemTab;
371 xmlRelaxNGDefinePtr pdef;
381struct _xmlRelaxNGInclude {
382 xmlRelaxNGIncludePtr
next;
394struct _xmlRelaxNGDocument {
395 xmlRelaxNGDocumentPtr
next;
418xmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt,
const char *
extra)
425 if (ctxt->serror !=
NULL)
426 schannel = ctxt->serror;
428 channel = ctxt->error;
429 data = ctxt->userData;
437 "Memory allocation failed : %s\n",
extra);
442 NULL,
NULL, 0, 0,
"Memory allocation failed\n");
453xmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt,
const char *
extra)
460 if (ctxt->serror !=
NULL)
461 schannel = ctxt->serror;
463 channel = ctxt->error;
464 data = ctxt->userData;
472 "Memory allocation failed : %s\n",
extra);
477 NULL,
NULL, 0, 0,
"Memory allocation failed\n");
492xmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node,
int error,
500 if (ctxt->serror !=
NULL)
501 schannel = ctxt->serror;
503 channel = ctxt->error;
504 data = ctxt->userData;
526xmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr
node,
int error,
534 if (ctxt->serror !=
NULL)
535 schannel = ctxt->serror;
537 channel = ctxt->error;
538 data = ctxt->userData;
626typedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary;
627typedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr;
628struct _xmlRelaxNGTypeLibrary {
631 xmlRelaxNGTypeHave have;
632 xmlRelaxNGTypeCheck
check;
633 xmlRelaxNGTypeCompare comp;
634 xmlRelaxNGFacetCheck facet;
635 xmlRelaxNGTypeFree freef;
643static void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar);
644static void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr
define);
646static void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr
schema);
647static int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt
649 xmlRelaxNGValidStatePtr state1,
650 xmlRelaxNGValidStatePtr state2);
651static void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
652 xmlRelaxNGValidStatePtr
state);
661xmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu)
666 if (docu->href !=
NULL)
668 if (docu->doc !=
NULL)
669 xmlFreeDoc(docu->doc);
670 if (docu->schema !=
NULL)
671 xmlRelaxNGFreeInnerSchema(docu->schema);
682xmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu)
684 xmlRelaxNGDocumentPtr
next;
686 while (docu !=
NULL) {
688 xmlRelaxNGFreeDocument(docu);
700xmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl)
705 if (incl->href !=
NULL)
707 if (incl->doc !=
NULL)
708 xmlFreeDoc(incl->doc);
709 if (incl->schema !=
NULL)
710 xmlRelaxNGFree(incl->schema);
721xmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl)
723 xmlRelaxNGIncludePtr
next;
725 while (incl !=
NULL) {
727 xmlRelaxNGFreeInclude(incl);
741xmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt)
747 xmlRngPErrMemory(ctxt,
NULL);
762xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr
schema)
773 xmlRelaxNGFreeDefine(
schema->defTab[
i]);
787xmlRelaxNGFree(xmlRelaxNGPtr
schema)
793 xmlRelaxNGFreeGrammar(
schema->topgrammar);
797 xmlRelaxNGFreeDocumentList(
schema->documents);
799 xmlRelaxNGFreeIncludeList(
schema->includes);
804 xmlRelaxNGFreeDefine(
schema->defTab[
i]);
819static xmlRelaxNGGrammarPtr
820xmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt)
822 xmlRelaxNGGrammarPtr
ret;
824 ret = (xmlRelaxNGGrammarPtr)
xmlMalloc(
sizeof(xmlRelaxNGGrammar));
826 xmlRngPErrMemory(ctxt,
NULL);
829 memset(
ret, 0,
sizeof(xmlRelaxNGGrammar));
841xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar)
846 if (grammar->children !=
NULL) {
847 xmlRelaxNGFreeGrammar(grammar->children);
849 if (grammar->next !=
NULL) {
850 xmlRelaxNGFreeGrammar(grammar->next);
852 if (grammar->refs !=
NULL) {
855 if (grammar->defs !=
NULL) {
871static xmlRelaxNGDefinePtr
872xmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
874 xmlRelaxNGDefinePtr
ret;
876 if (ctxt->defMax == 0) {
879 ctxt->defTab = (xmlRelaxNGDefinePtr *)
880 xmlMalloc(ctxt->defMax *
sizeof(xmlRelaxNGDefinePtr));
881 if (ctxt->defTab ==
NULL) {
882 xmlRngPErrMemory(ctxt,
"allocating define\n");
885 }
else if (ctxt->defMax <= ctxt->defNr) {
886 xmlRelaxNGDefinePtr *tmp;
889 tmp = (xmlRelaxNGDefinePtr *)
xmlRealloc(ctxt->defTab,
892 (xmlRelaxNGDefinePtr));
894 xmlRngPErrMemory(ctxt,
"allocating define\n");
899 ret = (xmlRelaxNGDefinePtr)
xmlMalloc(
sizeof(xmlRelaxNGDefine));
901 xmlRngPErrMemory(ctxt,
"allocating define\n");
904 memset(
ret, 0,
sizeof(xmlRelaxNGDefine));
905 ctxt->defTab[ctxt->defNr++] =
ret;
918xmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions)
920 xmlRelaxNGInterleaveGroupPtr
group;
923 if (partitions !=
NULL) {
924 if (partitions->groups !=
NULL) {
925 for (
j = 0;
j < partitions->nbgroups;
j++) {
926 group = partitions->groups[
j];
937 if (partitions->triage !=
NULL) {
951xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr
define)
957 xmlRelaxNGTypeLibraryPtr lib;
959 lib = (xmlRelaxNGTypeLibraryPtr)
define->data;
961 lib->freef(lib->data, (
void *)
define->attrs);
964 xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr)
define->data);
974 xmlRegFreeRegexp(
define->contModel);
987static xmlRelaxNGStatesPtr
988xmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt,
int size)
990 xmlRelaxNGStatesPtr
ret;
992 if ((ctxt !=
NULL) &&
993 (ctxt->freeStates !=
NULL) && (ctxt->freeStatesNr > 0)) {
994 ctxt->freeStatesNr--;
995 ret = ctxt->freeStates[ctxt->freeStatesNr];
1002 ret = (xmlRelaxNGStatesPtr)
xmlMalloc(
sizeof(xmlRelaxNGStates) +
1005 sizeof(xmlRelaxNGValidStatePtr));
1007 xmlRngVErrMemory(ctxt,
"allocating states\n");
1014 (xmlRelaxNGValidStatePtr));
1016 xmlRngVErrMemory(ctxt,
"allocating states\n");
1035xmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt,
1036 xmlRelaxNGStatesPtr states,
1037 xmlRelaxNGValidStatePtr
state)
1042 if (states->nbState >= states->maxState) {
1043 xmlRelaxNGValidStatePtr *tmp;
1046 size = states->maxState * 2;
1047 tmp = (xmlRelaxNGValidStatePtr *)
xmlRealloc(states->tabState,
1050 (xmlRelaxNGValidStatePtr));
1052 xmlRngVErrMemory(ctxt,
"adding states\n");
1055 states->tabState = tmp;
1056 states->maxState =
size;
1058 states->tabState[states->nbState++] =
state;
1073xmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt,
1074 xmlRelaxNGStatesPtr states,
1075 xmlRelaxNGValidStatePtr
state)
1082 if (states->nbState >= states->maxState) {
1083 xmlRelaxNGValidStatePtr *tmp;
1086 size = states->maxState * 2;
1087 tmp = (xmlRelaxNGValidStatePtr *)
xmlRealloc(states->tabState,
1090 (xmlRelaxNGValidStatePtr));
1092 xmlRngVErrMemory(ctxt,
"adding states\n");
1095 states->tabState = tmp;
1096 states->maxState =
size;
1098 for (
i = 0;
i < states->nbState;
i++) {
1099 if (xmlRelaxNGEqualValidState(ctxt,
state, states->tabState[
i])) {
1100 xmlRelaxNGFreeValidState(ctxt,
state);
1104 states->tabState[states->nbState++] =
state;
1116xmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt,
1117 xmlRelaxNGStatesPtr states)
1121 if ((ctxt !=
NULL) && (ctxt->freeStates ==
NULL)) {
1122 ctxt->freeStatesMax = 40;
1123 ctxt->freeStatesNr = 0;
1124 ctxt->freeStates = (xmlRelaxNGStatesPtr *)
1125 xmlMalloc(ctxt->freeStatesMax *
sizeof(xmlRelaxNGStatesPtr));
1126 if (ctxt->freeStates ==
NULL) {
1127 xmlRngVErrMemory(ctxt,
"storing states\n");
1129 }
else if ((ctxt !=
NULL)
1130 && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) {
1131 xmlRelaxNGStatesPtr *tmp;
1133 tmp = (xmlRelaxNGStatesPtr *)
xmlRealloc(ctxt->freeStates,
1134 2 * ctxt->freeStatesMax *
1136 (xmlRelaxNGStatesPtr));
1138 xmlRngVErrMemory(ctxt,
"storing states\n");
1143 ctxt->freeStates = tmp;
1144 ctxt->freeStatesMax *= 2;
1146 if ((ctxt ==
NULL) || (ctxt->freeStates ==
NULL)) {
1150 ctxt->freeStates[ctxt->freeStatesNr++] = states;
1163static xmlRelaxNGValidStatePtr
1164xmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr
node)
1166 xmlRelaxNGValidStatePtr
ret;
1168 xmlAttrPtr attrs[MAX_ATTR];
1173 root = xmlDocGetRootElement(ctxt->doc);
1179 if (nbAttrs < MAX_ATTR)
1180 attrs[nbAttrs++] =
attr;
1186 if ((ctxt->freeState !=
NULL) && (ctxt->freeState->nbState > 0)) {
1187 ctxt->freeState->nbState--;
1188 ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
1191 (xmlRelaxNGValidStatePtr)
1192 xmlMalloc(
sizeof(xmlRelaxNGValidState));
1194 xmlRngVErrMemory(ctxt,
"allocating states\n");
1197 memset(
ret, 0,
sizeof(xmlRelaxNGValidState));
1202 ret->node = (xmlNodePtr) ctxt->doc;
1214 ret->maxAttrs = nbAttrs;
1216 sizeof(xmlAttrPtr));
1218 xmlRngVErrMemory(ctxt,
"allocating states\n");
1221 }
else if (
ret->maxAttrs < nbAttrs) {
1225 sizeof(xmlAttrPtr));
1227 xmlRngVErrMemory(ctxt,
"allocating states\n");
1231 ret->maxAttrs = nbAttrs;
1233 ret->nbAttrs = nbAttrs;
1234 if (nbAttrs < MAX_ATTR) {
1235 memcpy(
ret->attrs, attrs,
sizeof(xmlAttrPtr) * nbAttrs);
1245 ret->nbAttrLeft =
ret->nbAttrs;
1258static xmlRelaxNGValidStatePtr
1259xmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt,
1260 xmlRelaxNGValidStatePtr
state)
1262 xmlRelaxNGValidStatePtr
ret;
1263 unsigned int maxAttrs;
1268 if ((ctxt->freeState !=
NULL) && (ctxt->freeState->nbState > 0)) {
1269 ctxt->freeState->nbState--;
1270 ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
1273 (xmlRelaxNGValidStatePtr)
1274 xmlMalloc(
sizeof(xmlRelaxNGValidState));
1276 xmlRngVErrMemory(ctxt,
"allocating states\n");
1279 memset(
ret, 0,
sizeof(xmlRelaxNGValidState));
1282 maxAttrs =
ret->maxAttrs;
1285 ret->maxAttrs = maxAttrs;
1286 if (
state->nbAttrs > 0) {
1290 sizeof(xmlAttrPtr));
1292 xmlRngVErrMemory(ctxt,
"allocating states\n");
1296 }
else if (
ret->maxAttrs <
state->nbAttrs) {
1300 sizeof(xmlAttrPtr));
1302 xmlRngVErrMemory(ctxt,
"allocating states\n");
1310 state->nbAttrs *
sizeof(xmlAttrPtr));
1327 xmlRelaxNGValidStatePtr state1,
1328 xmlRelaxNGValidStatePtr state2)
1332 if ((state1 ==
NULL) || (state2 ==
NULL))
1334 if (state1 == state2)
1336 if (state1->node != state2->node)
1338 if (state1->seq != state2->seq)
1340 if (state1->nbAttrLeft != state2->nbAttrLeft)
1342 if (state1->nbAttrs != state2->nbAttrs)
1344 if (state1->endvalue != state2->endvalue)
1346 if ((state1->value != state2->value) &&
1349 for (
i = 0;
i < state1->nbAttrs;
i++) {
1350 if (state1->attrs[
i] != state2->attrs[
i])
1363xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
1364 xmlRelaxNGValidStatePtr
state)
1369 if ((ctxt !=
NULL) && (ctxt->freeState ==
NULL)) {
1370 ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40);
1372 if ((ctxt ==
NULL) || (ctxt->freeState ==
NULL)) {
1377 xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState,
state);
1398xmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt,
int flags)
1400 if (ctxt ==
NULL)
return(-1);
1401 if (
flags & XML_RELAXNGP_FREE_DOC) {
1402 ctxt->crng |= XML_RELAXNGP_FREE_DOC;
1403 flags -= XML_RELAXNGP_FREE_DOC;
1405 if (
flags & XML_RELAXNGP_CRNG) {
1406 ctxt->crng |= XML_RELAXNGP_CRNG;
1407 flags -= XML_RELAXNGP_CRNG;
1409 if (
flags != 0)
return(-1);
1418static xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt,
1431xmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt,
1432 xmlRelaxNGIncludePtr
value)
1434 if (ctxt->incTab ==
NULL) {
1438 (xmlRelaxNGIncludePtr *)
xmlMalloc(ctxt->incMax *
1439 sizeof(ctxt->incTab[0]));
1440 if (ctxt->incTab ==
NULL) {
1441 xmlRngPErrMemory(ctxt,
"allocating include\n");
1445 if (ctxt->incNr >= ctxt->incMax) {
1448 (xmlRelaxNGIncludePtr *)
xmlRealloc(ctxt->incTab,
1450 sizeof(ctxt->incTab[0]));
1451 if (ctxt->incTab ==
NULL) {
1452 xmlRngPErrMemory(ctxt,
"allocating include\n");
1456 ctxt->incTab[ctxt->incNr] =
value;
1458 return (ctxt->incNr++);
1469static xmlRelaxNGIncludePtr
1470xmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt)
1472 xmlRelaxNGIncludePtr
ret;
1474 if (ctxt->incNr <= 0)
1477 if (ctxt->incNr > 0)
1478 ctxt->inc = ctxt->incTab[ctxt->incNr - 1];
1481 ret = ctxt->incTab[ctxt->incNr];
1482 ctxt->incTab[ctxt->incNr] =
NULL;
1498xmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt,
1503 xmlNodePtr tmp, tmp2;
1507 while (tmp !=
NULL) {
1509 if ((
name ==
NULL) && (IS_RELAXNG(tmp,
"start"))) {
1513 }
else if ((
name !=
NULL) && (IS_RELAXNG(tmp,
"define"))) {
1515 xmlRelaxNGNormExtSpace(
name2);
1524 }
else if (IS_RELAXNG(tmp,
"include")) {
1526 xmlRelaxNGDocumentPtr inc = tmp->psvi;
1528 if ((inc !=
NULL) && (inc->doc !=
NULL) &&
1529 (inc->doc->children !=
NULL)) {
1532 (inc->doc->children->name,
BAD_CAST "grammar")) {
1533 if (xmlRelaxNGRemoveRedefine(ctxt, href,
1534 xmlDocGetRootElement(inc->doc)->children,
1540 if (xmlRelaxNGRemoveRedefine(ctxt, URL, tmp->children,
name) == 1) {
1562static xmlRelaxNGIncludePtr
1563xmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt,
const xmlChar * URL,
1566 xmlRelaxNGIncludePtr
ret =
NULL;
1574 for (
i = 0;
i < ctxt->incNr;
i++) {
1577 "Detected an Include recursion for %s\n", URL,
1589 "xmlRelaxNG: could not load %s\n", URL,
NULL);
1596 ret = (xmlRelaxNGIncludePtr)
xmlMalloc(
sizeof(xmlRelaxNGInclude));
1598 xmlRngPErrMemory(ctxt,
"allocating include\n");
1602 memset(
ret, 0,
sizeof(xmlRelaxNGInclude));
1605 ret->next = ctxt->includes;
1606 ctxt->includes =
ret;
1612 root = xmlDocGetRootElement(doc);
1623 xmlRelaxNGIncludePush(ctxt,
ret);
1630 doc = xmlRelaxNGCleanupDoc(ctxt, doc);
1639 xmlRelaxNGIncludePop(ctxt);
1644 root = xmlDocGetRootElement(doc);
1647 "xmlRelaxNG: included document is empty %s\n", URL,
1651 if (!IS_RELAXNG(
root,
"grammar")) {
1653 "xmlRelaxNG: included document %s root is not a grammar\n",
1663 if (IS_RELAXNG(
cur,
"start")) {
1667 xmlRelaxNGRemoveRedefine(ctxt, URL,
root->children,
NULL);
1670 "xmlRelaxNG: include %s has a start but not the included grammar\n",
1673 }
else if (IS_RELAXNG(
cur,
"define")) {
1679 "xmlRelaxNG: include %s has define without name\n",
1684 xmlRelaxNGNormExtSpace(
name);
1685 found = xmlRelaxNGRemoveRedefine(ctxt, URL,
1689 "xmlRelaxNG: include %s has a define %s but not the included grammar\n",
1695 if (IS_RELAXNG(
cur,
"div") &&
cur->children !=
NULL) {
1726xmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt,
1730 xmlRelaxNGValidErrorPtr
cur;
1732 if (ctxt->errTab ==
NULL) {
1736 (xmlRelaxNGValidErrorPtr)
xmlMalloc(ctxt->errMax *
1738 (xmlRelaxNGValidError));
1739 if (ctxt->errTab ==
NULL) {
1740 xmlRngVErrMemory(ctxt,
"pushing error\n");
1745 if (ctxt->errNr >= ctxt->errMax) {
1748 (xmlRelaxNGValidErrorPtr)
xmlRealloc(ctxt->errTab,
1751 (xmlRelaxNGValidError));
1752 if (ctxt->errTab ==
NULL) {
1753 xmlRngVErrMemory(ctxt,
"pushing error\n");
1756 ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
1758 if ((ctxt->err !=
NULL) && (ctxt->state !=
NULL) &&
1759 (ctxt->err->node == ctxt->state->node) && (ctxt->err->err ==
err))
1760 return (ctxt->errNr);
1761 cur = &ctxt->errTab[ctxt->errNr];
1766 cur->flags = ERROR_IS_DUP;
1772 if (ctxt->state !=
NULL) {
1773 cur->node = ctxt->state->node;
1774 cur->seq = ctxt->state->seq;
1780 return (ctxt->errNr++);
1790xmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt)
1792 xmlRelaxNGValidErrorPtr
cur;
1794 if (ctxt->errNr <= 0) {
1799 if (ctxt->errNr > 0)
1800 ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
1803 cur = &ctxt->errTab[ctxt->errNr];
1804 if (
cur->flags & ERROR_IS_DUP) {
1825xmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt,
1826 xmlRelaxNGDocumentPtr
value)
1828 if (ctxt->docTab ==
NULL) {
1832 (xmlRelaxNGDocumentPtr *)
xmlMalloc(ctxt->docMax *
1833 sizeof(ctxt->docTab[0]));
1834 if (ctxt->docTab ==
NULL) {
1835 xmlRngPErrMemory(ctxt,
"adding document\n");
1839 if (ctxt->docNr >= ctxt->docMax) {
1842 (xmlRelaxNGDocumentPtr *)
xmlRealloc(ctxt->docTab,
1844 sizeof(ctxt->docTab[0]));
1845 if (ctxt->docTab ==
NULL) {
1846 xmlRngPErrMemory(ctxt,
"adding document\n");
1850 ctxt->docTab[ctxt->docNr] =
value;
1852 return (ctxt->docNr++);
1863static xmlRelaxNGDocumentPtr
1864xmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt)
1866 xmlRelaxNGDocumentPtr
ret;
1868 if (ctxt->docNr <= 0)
1871 if (ctxt->docNr > 0)
1872 ctxt->doc = ctxt->docTab[ctxt->docNr - 1];
1875 ret = ctxt->docTab[ctxt->docNr];
1876 ctxt->docTab[ctxt->docNr] =
NULL;
1892static xmlRelaxNGDocumentPtr
1893xmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt,
1896 xmlRelaxNGDocumentPtr
ret =
NULL;
1904 for (
i = 0;
i < ctxt->docNr;
i++) {
1907 "Detected an externalRef recursion for %s\n", URL,
1919 "xmlRelaxNG: could not load %s\n", URL,
NULL);
1926 ret = (xmlRelaxNGDocumentPtr)
xmlMalloc(
sizeof(xmlRelaxNGDocument));
1929 "xmlRelaxNG: allocate memory for doc %s\n", URL,
NULL);
1933 memset(
ret, 0,
sizeof(xmlRelaxNGDocument));
1936 ret->next = ctxt->documents;
1937 ret->externalRef = 1;
1938 ctxt->documents =
ret;
1944 root = xmlDocGetRootElement(doc);
1955 xmlRelaxNGDocumentPush(ctxt,
ret);
1960 doc = xmlRelaxNGCleanupDoc(ctxt, doc);
1966 xmlRelaxNGDocumentPop(ctxt);
1977#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0);
1978#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0);
1979#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0);
1980#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1);
1981#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1);
1984xmlRelaxNGDefName(xmlRelaxNGDefinePtr def)
1988 switch (def->type) {
1989 case XML_RELAXNG_EMPTY:
1991 case XML_RELAXNG_NOT_ALLOWED:
1992 return (
"notAllowed");
1993 case XML_RELAXNG_EXCEPT:
1995 case XML_RELAXNG_TEXT:
1997 case XML_RELAXNG_ELEMENT:
1999 case XML_RELAXNG_DATATYPE:
2000 return (
"datatype");
2001 case XML_RELAXNG_VALUE:
2003 case XML_RELAXNG_LIST:
2005 case XML_RELAXNG_ATTRIBUTE:
2006 return (
"attribute");
2007 case XML_RELAXNG_DEF:
2009 case XML_RELAXNG_REF:
2011 case XML_RELAXNG_EXTERNALREF:
2012 return (
"externalRef");
2013 case XML_RELAXNG_PARENTREF:
2014 return (
"parentRef");
2015 case XML_RELAXNG_OPTIONAL:
2016 return (
"optional");
2017 case XML_RELAXNG_ZEROORMORE:
2018 return (
"zeroOrMore");
2019 case XML_RELAXNG_ONEORMORE:
2020 return (
"oneOrMore");
2021 case XML_RELAXNG_CHOICE:
2023 case XML_RELAXNG_GROUP:
2025 case XML_RELAXNG_INTERLEAVE:
2026 return (
"interleave");
2027 case XML_RELAXNG_START:
2029 case XML_RELAXNG_NOOP:
2031 case XML_RELAXNG_PARAM:
2048xmlRelaxNGGetErrorString(xmlRelaxNGValidErr
err,
const xmlChar *
arg1,
2061 case XML_RELAXNG_OK:
2063 case XML_RELAXNG_ERR_MEMORY:
2065 case XML_RELAXNG_ERR_TYPE:
2068 case XML_RELAXNG_ERR_TYPEVAL:
2072 case XML_RELAXNG_ERR_DUPID:
2075 case XML_RELAXNG_ERR_TYPECMP:
2078 case XML_RELAXNG_ERR_NOSTATE:
2080 case XML_RELAXNG_ERR_NODEFINE:
2082 case XML_RELAXNG_ERR_INTERNAL:
2085 case XML_RELAXNG_ERR_LISTEXTRA:
2088 case XML_RELAXNG_ERR_INTERNODATA:
2090 (
"Internal: interleave block has no data\n"));
2091 case XML_RELAXNG_ERR_INTERSEQ:
2093 case XML_RELAXNG_ERR_INTEREXTRA:
2096 case XML_RELAXNG_ERR_ELEMNAME:
2100 case XML_RELAXNG_ERR_ELEMNONS:
2101 snprintf(
msg, 1000,
"Expecting a namespace for element %s\n",
2104 case XML_RELAXNG_ERR_ELEMWRONGNS:
2106 "Element %s has wrong namespace: expecting %s\n",
arg1,
2109 case XML_RELAXNG_ERR_ELEMWRONG:
2112 case XML_RELAXNG_ERR_TEXTWRONG:
2114 "Did not expect text in element %s content\n",
arg1);
2116 case XML_RELAXNG_ERR_ELEMEXTRANS:
2117 snprintf(
msg, 1000,
"Expecting no namespace for element %s\n",
2120 case XML_RELAXNG_ERR_ELEMNOTEMPTY:
2123 case XML_RELAXNG_ERR_NOELEM:
2124 snprintf(
msg, 1000,
"Expecting an element %s, got nothing\n",
2127 case XML_RELAXNG_ERR_NOTELEM:
2129 case XML_RELAXNG_ERR_ATTRVALID:
2130 snprintf(
msg, 1000,
"Element %s failed to validate attributes\n",
2133 case XML_RELAXNG_ERR_CONTENTVALID:
2134 snprintf(
msg, 1000,
"Element %s failed to validate content\n",
2137 case XML_RELAXNG_ERR_EXTRACONTENT:
2138 snprintf(
msg, 1000,
"Element %s has extra content: %s\n",
2141 case XML_RELAXNG_ERR_INVALIDATTR:
2142 snprintf(
msg, 1000,
"Invalid attribute %s for element %s\n",
2145 case XML_RELAXNG_ERR_LACKDATA:
2146 snprintf(
msg, 1000,
"Datatype element %s contains no data\n",
2149 case XML_RELAXNG_ERR_DATAELEM:
2150 snprintf(
msg, 1000,
"Datatype element %s has child elements\n",
2153 case XML_RELAXNG_ERR_VALELEM:
2154 snprintf(
msg, 1000,
"Value element %s has child elements\n",
2157 case XML_RELAXNG_ERR_LISTELEM:
2158 snprintf(
msg, 1000,
"List element %s has child elements\n",
2161 case XML_RELAXNG_ERR_DATATYPE:
2164 case XML_RELAXNG_ERR_VALUE:
2167 case XML_RELAXNG_ERR_LIST:
2169 case XML_RELAXNG_ERR_NOGRAMMAR:
2171 case XML_RELAXNG_ERR_EXTRADATA:
2196xmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt,
2197 xmlRelaxNGValidErr
err, xmlNodePtr
node,
2203 if (ctxt->flags & FLAGS_NOERROR)
2210 if (ctxt->errNo == XML_RELAXNG_OK)
2225xmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt,
int level)
2228 xmlRelaxNGValidErrorPtr
err;
2230 for (
i =
level;
i < ctxt->errNr;
i++) {
2231 err = &ctxt->errTab[
i];
2232 if (
err->flags & ERROR_IS_DUP) {
2242 ctxt->errNr =
level;
2243 if (ctxt->errNr <= 0)
2254xmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt)
2257 xmlRelaxNGValidErrorPtr
err,
dup;
2259 for (
i = 0,
k = 0;
i < ctxt->errNr;
i++) {
2260 err = &ctxt->errTab[
i];
2261 if (
k < MAX_ERROR) {
2262 for (
j = 0;
j <
i;
j++) {
2263 dup = &ctxt->errTab[
j];
2264 if ((
err->err ==
dup->err) && (
err->node ==
dup->node) &&
2270 xmlRelaxNGShowValidError(ctxt,
err->err,
err->node,
err->seq,
2275 if (
err->flags & ERROR_IS_DUP) {
2300xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt,
2306 if (ctxt->flags & FLAGS_NOERROR)
2312 if (((ctxt->flags & FLAGS_IGNORABLE) == 0) ||
2313 (ctxt->flags & FLAGS_NEGATIVE)) {
2314 xmlNodePtr
node, seq;
2320 if (ctxt->errNr != 0)
2321 xmlRelaxNGDumpValidError(ctxt);
2322 if (ctxt->state !=
NULL) {
2323 node = ctxt->state->node;
2324 seq = ctxt->state->seq;
2347static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
2363 xmlSchemaTypePtr typ;
2367 typ = xmlSchemaGetPredefinedType(
type,
2369 "http://www.w3.org/2001/XMLSchema");
2393 xmlSchemaTypePtr typ;
2398 typ = xmlSchemaGetPredefinedType(
type,
2400 "http://www.w3.org/2001/XMLSchema");
2403 ret = xmlSchemaValPredefTypeNode(typ,
value,
2433 xmlSchemaFacetPtr facet;
2434 xmlSchemaTypePtr typ;
2439 typ = xmlSchemaGetPredefinedType(
type,
2441 "http://www.w3.org/2001/XMLSchema");
2445 facet = xmlSchemaNewFacet();
2450 facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
2452 facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
2454 facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
2456 facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
2458 facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
2460 facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
2462 facet->type = XML_SCHEMA_FACET_PATTERN;
2464 facet->type = XML_SCHEMA_FACET_ENUMERATION;
2466 facet->type = XML_SCHEMA_FACET_WHITESPACE;
2468 facet->type = XML_SCHEMA_FACET_LENGTH;
2470 facet->type = XML_SCHEMA_FACET_MAXLENGTH;
2472 facet->type = XML_SCHEMA_FACET_MINLENGTH;
2474 xmlSchemaFreeFacet(facet);
2478 ret = xmlSchemaCheckFacet(facet, typ,
NULL,
type);
2480 xmlSchemaFreeFacet(facet);
2484 xmlSchemaFreeFacet(facet);
2502 xmlSchemaFreeValue(
value);
2523 const xmlChar * value2, xmlNodePtr ctxt2)
2526 xmlSchemaTypePtr typ;
2527 xmlSchemaValPtr res1 =
NULL, res2 =
NULL;
2531 typ = xmlSchemaGetPredefinedType(
type,
2533 "http://www.w3.org/2001/XMLSchema");
2536 if (comp1 ==
NULL) {
2537 ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1);
2543 res1 = (xmlSchemaValPtr) comp1;
2545 ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2);
2547 if (res1 != (xmlSchemaValPtr) comp1)
2548 xmlSchemaFreeValue(res1);
2551 ret = xmlSchemaCompareValues(res1, res2);
2552 if (res1 != (xmlSchemaValPtr) comp1)
2553 xmlSchemaFreeValue(res1);
2554 xmlSchemaFreeValue(res2);
2648 nval = xmlRelaxNGNormalize(
NULL, value1);
2649 nvalue = xmlRelaxNGNormalize(
NULL, value2);
2651 if ((nval ==
NULL) || (nvalue ==
NULL))
2667static int xmlRelaxNGTypeInitialized = 0;
2678xmlRelaxNGFreeTypeLibrary(
void *payload,
2681 xmlRelaxNGTypeLibraryPtr lib = (xmlRelaxNGTypeLibraryPtr) payload;
2684 if (lib->namespace !=
NULL)
2702xmlRelaxNGRegisterTypeLibrary(
const xmlChar *
namespace,
void *
data,
2703 xmlRelaxNGTypeHave have,
2704 xmlRelaxNGTypeCheck
check,
2705 xmlRelaxNGTypeCompare comp,
2706 xmlRelaxNGFacetCheck facet,
2707 xmlRelaxNGTypeFree freef)
2709 xmlRelaxNGTypeLibraryPtr lib;
2712 if ((xmlRelaxNGRegisteredTypes ==
NULL) || (
namespace ==
NULL) ||
2717 "Relax-NG types library '%s' already registered\n",
2722 (xmlRelaxNGTypeLibraryPtr)
2723 xmlMalloc(
sizeof(xmlRelaxNGTypeLibrary));
2725 xmlRngVErrMemory(
NULL,
"adding types library\n");
2728 memset(lib, 0,
sizeof(xmlRelaxNGTypeLibrary));
2739 "Relax-NG types library failed to register '%s'\n",
2741 xmlRelaxNGFreeTypeLibrary(lib,
namespace);
2755xmlRelaxNGInitTypes(
void)
2757 if (xmlRelaxNGTypeInitialized != 0)
2760 if (xmlRelaxNGRegisteredTypes ==
NULL) {
2762 "Failed to allocate sh table for Relax-NG types\n");
2765 xmlRelaxNGRegisterTypeLibrary(
BAD_CAST
2766 "http://www.w3.org/2001/XMLSchema-datatypes",
2767 NULL, xmlRelaxNGSchemaTypeHave,
2768 xmlRelaxNGSchemaTypeCheck,
2769 xmlRelaxNGSchemaTypeCompare,
2770 xmlRelaxNGSchemaFacetCheck,
2771 xmlRelaxNGSchemaFreeValue);
2772 xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs,
NULL,
2773 xmlRelaxNGDefaultTypeHave,
2774 xmlRelaxNGDefaultTypeCheck,
2775 xmlRelaxNGDefaultTypeCompare,
NULL,
2777 xmlRelaxNGTypeInitialized = 1;
2792xmlRelaxNGCleanupTypes(
void)
2794 xmlSchemaCleanupTypes();
2795 if (xmlRelaxNGTypeInitialized == 0)
2797 xmlHashFree(xmlRelaxNGRegisteredTypes, xmlRelaxNGFreeTypeLibrary);
2798 xmlRelaxNGTypeInitialized = 0;
2810static int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt,
2811 xmlRelaxNGDefinePtr def);
2822xmlRelaxNGIsCompilable(xmlRelaxNGDefinePtr def)
2829 if ((def->type != XML_RELAXNG_ELEMENT) &&
2830 (def->dflags & IS_COMPILABLE))
2832 if ((def->type != XML_RELAXNG_ELEMENT) &&
2833 (def->dflags & IS_NOT_COMPILABLE))
2835 switch (def->type) {
2836 case XML_RELAXNG_NOOP:
2837 ret = xmlRelaxNGIsCompilable(def->content);
2839 case XML_RELAXNG_TEXT:
2840 case XML_RELAXNG_EMPTY:
2843 case XML_RELAXNG_ELEMENT:
2847 if (((def->dflags & IS_NOT_COMPILABLE) == 0) &&
2848 ((def->dflags & IS_COMPILABLE) == 0)) {
2849 xmlRelaxNGDefinePtr
list;
2851 list = def->content;
2853 ret = xmlRelaxNGIsCompilable(
list);
2863 def->dflags &= ~IS_COMPILABLE;
2864 def->dflags |= IS_NOT_COMPILABLE;
2866 if ((
ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE))
2867 def->dflags |= IS_COMPILABLE;
2873 if ((def->nameClass !=
NULL) || (def->name ==
NULL))
2878 case XML_RELAXNG_REF:
2879 case XML_RELAXNG_EXTERNALREF:
2880 case XML_RELAXNG_PARENTREF:
2881 if (def->depth == -20) {
2884 xmlRelaxNGDefinePtr
list;
2887 list = def->content;
2889 ret = xmlRelaxNGIsCompilable(
list);
2896 case XML_RELAXNG_START:
2897 case XML_RELAXNG_OPTIONAL:
2898 case XML_RELAXNG_ZEROORMORE:
2899 case XML_RELAXNG_ONEORMORE:
2900 case XML_RELAXNG_CHOICE:
2901 case XML_RELAXNG_GROUP:
2902 case XML_RELAXNG_DEF:{
2903 xmlRelaxNGDefinePtr
list;
2905 list = def->content;
2907 ret = xmlRelaxNGIsCompilable(
list);
2914 case XML_RELAXNG_EXCEPT:
2915 case XML_RELAXNG_ATTRIBUTE:
2916 case XML_RELAXNG_INTERLEAVE:
2917 case XML_RELAXNG_DATATYPE:
2918 case XML_RELAXNG_LIST:
2919 case XML_RELAXNG_PARAM:
2920 case XML_RELAXNG_VALUE:
2921 case XML_RELAXNG_NOT_ALLOWED:
2926 def->dflags |= IS_NOT_COMPILABLE;
2928 def->dflags |= IS_COMPILABLE;
2943xmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
2946 xmlRelaxNGDefinePtr
list;
2948 if ((ctxt ==
NULL) || (def ==
NULL))
2951 switch (def->type) {
2952 case XML_RELAXNG_START:
2953 if ((xmlRelaxNGIsCompilable(def) == 1) && (def->depth != -25)) {
2954 xmlAutomataPtr oldam = ctxt->am;
2955 xmlAutomataStatePtr oldstate = ctxt->state;
2959 list = def->content;
2960 ctxt->am = xmlNewAutomata();
2961 if (ctxt->am ==
NULL)
2974 ctxt->state = xmlAutomataGetInitState(ctxt->am);
2976 xmlRelaxNGCompile(ctxt,
list);
2979 xmlAutomataSetFinalState(ctxt->am, ctxt->state);
2980 if (xmlAutomataIsDeterminist(ctxt->am))
2981 def->contModel = xmlAutomataCompile(ctxt->am);
2983 xmlFreeAutomata(ctxt->am);
2984 ctxt->state = oldstate;
2988 case XML_RELAXNG_ELEMENT:
2989 if ((ctxt->am !=
NULL) && (def->name !=
NULL)) {
2990 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
2995 if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
2996 xmlAutomataPtr oldam = ctxt->am;
2997 xmlAutomataStatePtr oldstate = ctxt->state;
3001 list = def->content;
3002 ctxt->am = xmlNewAutomata();
3003 if (ctxt->am ==
NULL)
3006 ctxt->state = xmlAutomataGetInitState(ctxt->am);
3008 xmlRelaxNGCompile(ctxt,
list);
3011 xmlAutomataSetFinalState(ctxt->am, ctxt->state);
3012 def->contModel = xmlAutomataCompile(ctxt->am);
3013 if (!xmlRegexpIsDeterminist(def->contModel)) {
3017 xmlRegFreeRegexp(def->contModel);
3018 def->contModel =
NULL;
3020 xmlFreeAutomata(ctxt->am);
3021 ctxt->state = oldstate;
3024 xmlAutomataPtr oldam = ctxt->am;
3031 ret = xmlRelaxNGTryCompile(ctxt, def);
3035 case XML_RELAXNG_NOOP:
3036 ret = xmlRelaxNGCompile(ctxt, def->content);
3038 case XML_RELAXNG_OPTIONAL:{
3039 xmlAutomataStatePtr oldstate = ctxt->state;
3041 list = def->content;
3043 xmlRelaxNGCompile(ctxt,
list);
3046 xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state);
3049 case XML_RELAXNG_ZEROORMORE:{
3050 xmlAutomataStatePtr oldstate;
3053 xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
NULL);
3054 oldstate = ctxt->state;
3055 list = def->content;
3057 xmlRelaxNGCompile(ctxt,
list);
3060 xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
3062 xmlAutomataNewEpsilon(ctxt->am, oldstate,
NULL);
3065 case XML_RELAXNG_ONEORMORE:{
3066 xmlAutomataStatePtr oldstate;
3068 list = def->content;
3070 xmlRelaxNGCompile(ctxt,
list);
3073 oldstate = ctxt->state;
3074 list = def->content;
3076 xmlRelaxNGCompile(ctxt,
list);
3079 xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
3081 xmlAutomataNewEpsilon(ctxt->am, oldstate,
NULL);
3084 case XML_RELAXNG_CHOICE:{
3086 xmlAutomataStatePtr oldstate = ctxt->state;
3088 list = def->content;
3090 ctxt->state = oldstate;
3091 ret = xmlRelaxNGCompile(ctxt,
list);
3097 xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
3106 case XML_RELAXNG_REF:
3107 case XML_RELAXNG_EXTERNALREF:
3108 case XML_RELAXNG_PARENTREF:
3109 case XML_RELAXNG_GROUP:
3110 case XML_RELAXNG_DEF:
3111 list = def->content;
3113 ret = xmlRelaxNGCompile(ctxt,
list);
3119 case XML_RELAXNG_TEXT:{
3120 xmlAutomataStatePtr oldstate;
3123 xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
NULL);
3124 oldstate = ctxt->state;
3125 xmlRelaxNGCompile(ctxt, def->content);
3126 xmlAutomataNewTransition(ctxt->am, ctxt->state,
3130 xmlAutomataNewEpsilon(ctxt->am, oldstate,
NULL);
3133 case XML_RELAXNG_EMPTY:
3135 xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
NULL);
3137 case XML_RELAXNG_EXCEPT:
3138 case XML_RELAXNG_ATTRIBUTE:
3139 case XML_RELAXNG_INTERLEAVE:
3140 case XML_RELAXNG_NOT_ALLOWED:
3141 case XML_RELAXNG_DATATYPE:
3142 case XML_RELAXNG_LIST:
3143 case XML_RELAXNG_PARAM:
3144 case XML_RELAXNG_VALUE:
3146 fprintf(
stderr,
"RNG internal error trying to compile %s\n",
3147 xmlRelaxNGDefName(def));
3164xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
3167 xmlRelaxNGDefinePtr
list;
3169 if ((ctxt ==
NULL) || (def ==
NULL))
3172 if ((def->type == XML_RELAXNG_START) ||
3173 (def->type == XML_RELAXNG_ELEMENT)) {
3174 ret = xmlRelaxNGIsCompilable(def);
3175 if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
3177 ret = xmlRelaxNGCompile(ctxt, def);
3181 switch (def->type) {
3182 case XML_RELAXNG_NOOP:
3183 ret = xmlRelaxNGTryCompile(ctxt, def->content);
3185 case XML_RELAXNG_TEXT:
3186 case XML_RELAXNG_DATATYPE:
3187 case XML_RELAXNG_LIST:
3188 case XML_RELAXNG_PARAM:
3189 case XML_RELAXNG_VALUE:
3190 case XML_RELAXNG_EMPTY:
3191 case XML_RELAXNG_ELEMENT:
3194 case XML_RELAXNG_OPTIONAL:
3195 case XML_RELAXNG_ZEROORMORE:
3196 case XML_RELAXNG_ONEORMORE:
3197 case XML_RELAXNG_CHOICE:
3198 case XML_RELAXNG_GROUP:
3199 case XML_RELAXNG_DEF:
3200 case XML_RELAXNG_START:
3201 case XML_RELAXNG_REF:
3202 case XML_RELAXNG_EXTERNALREF:
3203 case XML_RELAXNG_PARENTREF:
3204 list = def->content;
3206 ret = xmlRelaxNGTryCompile(ctxt,
list);
3212 case XML_RELAXNG_EXCEPT:
3213 case XML_RELAXNG_ATTRIBUTE:
3214 case XML_RELAXNG_INTERLEAVE:
3215 case XML_RELAXNG_NOT_ALLOWED:
3228static xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr
3229 ctxt, xmlNodePtr
node);
3230static xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr
3231 ctxt, xmlNodePtr
node);
3232static xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr
3233 ctxt, xmlNodePtr nodes,
3235static xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr
3236 ctxt, xmlNodePtr
node);
3237static xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt,
3239static int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
3241static xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr
3242 ctxt, xmlNodePtr
node,
3245static xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr
3246 ctxt, xmlNodePtr nodes);
3247static int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
3248 xmlRelaxNGDefinePtr
define,
3252#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content))
3263xmlRelaxNGIsNullable(xmlRelaxNGDefinePtr
define)
3270 if (
define->dflags & IS_NULLABLE)
3272 if (
define->dflags & IS_NOT_NULLABLE)
3275 case XML_RELAXNG_EMPTY:
3276 case XML_RELAXNG_TEXT:
3279 case XML_RELAXNG_NOOP:
3280 case XML_RELAXNG_DEF:
3281 case XML_RELAXNG_REF:
3282 case XML_RELAXNG_EXTERNALREF:
3283 case XML_RELAXNG_PARENTREF:
3284 case XML_RELAXNG_ONEORMORE:
3285 ret = xmlRelaxNGIsNullable(
define->content);
3287 case XML_RELAXNG_EXCEPT:
3288 case XML_RELAXNG_NOT_ALLOWED:
3289 case XML_RELAXNG_ELEMENT:
3290 case XML_RELAXNG_DATATYPE:
3291 case XML_RELAXNG_PARAM:
3292 case XML_RELAXNG_VALUE:
3293 case XML_RELAXNG_LIST:
3294 case XML_RELAXNG_ATTRIBUTE:
3297 case XML_RELAXNG_CHOICE:{
3301 ret = xmlRelaxNGIsNullable(
list);
3309 case XML_RELAXNG_START:
3310 case XML_RELAXNG_INTERLEAVE:
3311 case XML_RELAXNG_GROUP:{
3315 ret = xmlRelaxNGIsNullable(
list);
3327 define->dflags |= IS_NOT_NULLABLE;
3329 define->dflags |= IS_NULLABLE;
3372 if ((IS_RELAXNG(
node,
"data")) || (IS_RELAXNG(
node,
"value"))) {
3388 while ((
node !=
NULL) && (
node->type == XML_ELEMENT_NODE)) {
3416static xmlRelaxNGDefinePtr
3417xmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
3419 xmlRelaxNGDefinePtr def =
NULL;
3420 xmlRelaxNGTypeLibraryPtr lib =
NULL;
3425 def = xmlRelaxNGNewDefine(ctxt,
node);
3428 def->type = XML_RELAXNG_VALUE;
3432 xmlRelaxNGNormExtSpace(
type);
3433 if (xmlValidateNCName(
type, 0)) {
3435 "value type '%s' is not an NCName\n",
type,
NULL);
3437 library = xmlRelaxNGGetDataTypeLibrary(ctxt,
node);
3445 lib = (xmlRelaxNGTypeLibraryPtr)
3449 "Use of unregistered type library '%s'\n",
library,
3454 if (lib->have ==
NULL) {
3456 "Internal error with type library '%s': no 'have'\n",
3459 success = lib->have(lib->data, def->name);
3462 "Error type '%s' is not exported by type library '%s'\n",
3470 }
else if (((
node->children->type != XML_TEXT_NODE) &&
3471 (
node->children->type != XML_CDATA_SECTION_NODE)) ||
3474 "Expecting a single text value for <value>content\n",
3476 }
else if (def !=
NULL) {
3477 def->value = xmlNodeGetContent(
node);
3478 if (def->value ==
NULL) {
3480 "Element <value> has no content\n",
NULL,
NULL);
3485 lib->check(lib->data, def->name, def->value, &
val,
node);
3488 "Value '%s' is not acceptable for type '%s'\n",
3489 def->value, def->name);
3508static xmlRelaxNGDefinePtr
3509xmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
3512 xmlRelaxNGDefinePtr
param, lastparam =
NULL;
3513 xmlRelaxNGTypeLibraryPtr lib;
3525 xmlRelaxNGNormExtSpace(
type);
3526 if (xmlValidateNCName(
type, 0)) {
3528 "data type '%s' is not an NCName\n",
type,
NULL);
3530 library = xmlRelaxNGGetDataTypeLibrary(ctxt,
node);
3535 def = xmlRelaxNGNewDefine(ctxt,
node);
3541 def->type = XML_RELAXNG_DATATYPE;
3545 lib = (xmlRelaxNGTypeLibraryPtr)
3549 "Use of unregistered type library '%s'\n",
library,
3554 if (lib->have ==
NULL) {
3556 "Internal error with type library '%s': no 'have'\n",
3559 tmp = lib->have(lib->data, def->name);
3562 "Error type '%s' is not exported by type library '%s'\n",
3568 "http://www.w3.org/2001/XMLSchema-datatypes"))
3584 BAD_CAST "http://relaxng.org/ns/structure/1.0")) {
3586 "Type library '%s' does not allow type parameters\n",
3593 param = xmlRelaxNGNewDefine(ctxt,
node);
3595 param->type = XML_RELAXNG_PARAM;
3599 "param has no name\n",
NULL,
NULL);
3602 if (lastparam ==
NULL) {
3603 def->attrs = lastparam =
param;
3605 lastparam->next =
param;
3620 xmlRelaxNGDefinePtr tmp2,
last =
NULL;
3626 except->type = XML_RELAXNG_EXCEPT;
3631 "except has no content\n",
NULL,
NULL);
3634 tmp2 = xmlRelaxNGParsePattern(ctxt,
child);
3652 "Element data has unexpected content %s\n",
3675xmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1,
3676 xmlRelaxNGDefinePtr def2)
3681 xmlRelaxNGValidCtxt ctxt;
3683 memset(&ctxt, 0,
sizeof(xmlRelaxNGValidCtxt));
3685 ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR;
3687 if ((def1->type == XML_RELAXNG_ELEMENT) ||
3688 (def1->type == XML_RELAXNG_ATTRIBUTE)) {
3689 if (def2->type == XML_RELAXNG_TEXT)
3691 if (def1->name !=
NULL) {
3692 node.name = def1->name;
3694 node.name = invalidName;
3696 if (def1->ns !=
NULL) {
3697 if (def1->ns[0] == 0) {
3706 if (xmlRelaxNGElementMatch(&ctxt, def2, &
node)) {
3707 if (def1->nameClass !=
NULL) {
3708 ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2);
3715 }
else if (def1->type == XML_RELAXNG_TEXT) {
3716 if (def2->type == XML_RELAXNG_TEXT)
3719 }
else if (def1->type == XML_RELAXNG_EXCEPT) {
3720 ret = xmlRelaxNGCompareNameClasses(def1->content, def2);
3730 if ((def2->type == XML_RELAXNG_ELEMENT) ||
3731 (def2->type == XML_RELAXNG_ATTRIBUTE)) {
3732 if (def2->name !=
NULL) {
3733 node.name = def2->name;
3735 node.name = invalidName;
3738 if (def2->ns !=
NULL) {
3739 if (def2->ns[0] == 0) {
3745 ns.href = invalidName;
3747 if (xmlRelaxNGElementMatch(&ctxt, def1, &
node)) {
3748 if (def2->nameClass !=
NULL) {
3749 ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1);
3776xmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt
3778 xmlRelaxNGDefinePtr * def2)
3780 xmlRelaxNGDefinePtr *basedef2 = def2;
3782 if ((def1 ==
NULL) || (def2 ==
NULL))
3784 if ((*def1 ==
NULL) || (*def2 ==
NULL))
3786 while (*def1 !=
NULL) {
3787 while ((*def2) !=
NULL) {
3788 if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0)
3808xmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt,
3809 xmlRelaxNGDefinePtr def)
3817 if (ctxt->nbErrors != 0)
3823 if ((
cur->type == XML_RELAXNG_ELEMENT) ||
3824 (
cur->type == XML_RELAXNG_TEXT) ||
3825 (
cur->type == XML_RELAXNG_DATATYPE) ||
3826 (
cur->type == XML_RELAXNG_PARAM) ||
3827 (
cur->type == XML_RELAXNG_LIST) ||
3828 (
cur->type == XML_RELAXNG_VALUE) ||
3829 (
cur->type == XML_RELAXNG_EMPTY))
3831 if ((
cur->type == XML_RELAXNG_CHOICE) ||
3832 (
cur->type == XML_RELAXNG_INTERLEAVE) ||
3833 (
cur->type == XML_RELAXNG_GROUP) ||
3834 (
cur->type == XML_RELAXNG_ONEORMORE) ||
3835 (
cur->type == XML_RELAXNG_ZEROORMORE) ||
3836 (
cur->type == XML_RELAXNG_OPTIONAL) ||
3837 (
cur->type == XML_RELAXNG_PARENTREF) ||
3838 (
cur->type == XML_RELAXNG_EXTERNALREF) ||
3839 (
cur->type == XML_RELAXNG_REF) ||
3840 (
cur->type == XML_RELAXNG_DEF)) {
3845 while (tmp !=
NULL) {
3883static xmlRelaxNGDefinePtr *
3884xmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt,
3885 xmlRelaxNGDefinePtr def,
int eora)
3895 if (ctxt->nbErrors != 0)
3901 if (((eora == 0) && ((
cur->type == XML_RELAXNG_ELEMENT) ||
3902 (
cur->type == XML_RELAXNG_TEXT))) ||
3903 ((eora == 1) && (
cur->type == XML_RELAXNG_ATTRIBUTE)) ||
3904 ((eora == 2) && ((
cur->type == XML_RELAXNG_DATATYPE) ||
3905 (
cur->type == XML_RELAXNG_ELEMENT) ||
3906 (
cur->type == XML_RELAXNG_LIST) ||
3907 (
cur->type == XML_RELAXNG_TEXT) ||
3908 (
cur->type == XML_RELAXNG_VALUE)))) {
3911 ret = (xmlRelaxNGDefinePtr *)
3914 xmlRngPErrMemory(ctxt,
"getting element list\n");
3918 xmlRelaxNGDefinePtr *
temp;
3922 (
max + 1) *
sizeof(xmlRelaxNGDefinePtr));
3924 xmlRngPErrMemory(ctxt,
"getting element list\n");
3932 }
else if ((
cur->type == XML_RELAXNG_CHOICE) ||
3933 (
cur->type == XML_RELAXNG_INTERLEAVE) ||
3934 (
cur->type == XML_RELAXNG_GROUP) ||
3935 (
cur->type == XML_RELAXNG_ONEORMORE) ||
3936 (
cur->type == XML_RELAXNG_ZEROORMORE) ||
3937 (
cur->type == XML_RELAXNG_OPTIONAL) ||
3938 (
cur->type == XML_RELAXNG_PARENTREF) ||
3939 (
cur->type == XML_RELAXNG_REF) ||
3940 (
cur->type == XML_RELAXNG_DEF) ||
3941 (
cur->type == XML_RELAXNG_EXTERNALREF)) {
3950 while (tmp !=
NULL) {
3986xmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt,
3987 xmlRelaxNGDefinePtr def)
3989 xmlRelaxNGDefinePtr **
list;
3990 xmlRelaxNGDefinePtr
cur;
3991 int nbchild = 0,
i,
j,
ret;
3992 int is_nullable = 0;
3993 int is_indeterminist = 0;
3997 if ((def ==
NULL) || (def->type != XML_RELAXNG_CHOICE))
4000 if (def->dflags & IS_PROCESSED)
4007 if (ctxt->nbErrors != 0)
4010 is_nullable = xmlRelaxNGIsNullable(def);
4019 sizeof(xmlRelaxNGDefinePtr
4022 xmlRngPErrMemory(ctxt,
"building choice\n");
4029 if (is_nullable == 0) {
4036 list[
i] = xmlRelaxNGGetElements(ctxt,
cur, 0);
4039 }
else if (is_triable == 1) {
4040 xmlRelaxNGDefinePtr *tmp;
4044 while ((*tmp !=
NULL) && (is_triable == 1)) {
4045 if ((*tmp)->type == XML_RELAXNG_TEXT) {
4051 }
else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
4052 ((*tmp)->name !=
NULL)) {
4053 if (((*tmp)->ns ==
NULL) || ((*tmp)->ns[0] == 0))
4059 (*tmp)->name, (*tmp)->ns,
4063 }
else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
4064 if (((*tmp)->ns ==
NULL) || ((*tmp)->ns[0] == 0))
4084 for (
i = 0;
i < nbchild;
i++) {
4087 for (
j = 0;
j <
i;
j++) {
4090 ret = xmlRelaxNGCompareElemDefLists(ctxt,
list[
i],
list[
j]);
4092 is_indeterminist = 1;
4096 for (
i = 0;
i < nbchild;
i++) {
4102 if (is_indeterminist) {
4103 def->dflags |= IS_INDETERMINIST;
4105 if (is_triable == 1) {
4106 def->dflags |= IS_TRIABLE;
4108 }
else if (triage !=
NULL) {
4111 def->dflags |= IS_PROCESSED;
4122xmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt,
4123 xmlRelaxNGDefinePtr def)
4125 xmlRelaxNGDefinePtr **
list;
4126 xmlRelaxNGDefinePtr
cur;
4127 int nbchild = 0,
i,
j,
ret;
4129 if ((def ==
NULL) ||
4130 ((def->type != XML_RELAXNG_GROUP) &&
4131 (def->type != XML_RELAXNG_ELEMENT)))
4134 if (def->dflags & IS_PROCESSED)
4141 if (ctxt->nbErrors != 0)
4156 sizeof(xmlRelaxNGDefinePtr
4159 xmlRngPErrMemory(ctxt,
"building group\n");
4165 list[
i] = xmlRelaxNGGetElements(ctxt,
cur, 1);
4171 list[
i] = xmlRelaxNGGetElements(ctxt,
cur, 1);
4176 for (
i = 0;
i < nbchild;
i++) {
4179 for (
j = 0;
j <
i;
j++) {
4182 ret = xmlRelaxNGCompareElemDefLists(ctxt,
list[
i],
list[
j]);
4185 "Attributes conflicts in group\n",
NULL,
NULL);
4189 for (
i = 0;
i < nbchild;
i++) {
4195 def->dflags |= IS_PROCESSED;
4214xmlRelaxNGComputeInterleaves(
void *payload,
void *
data,
4217 xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload;
4218 xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr)
data;
4219 xmlRelaxNGDefinePtr
cur, *tmp;
4221 xmlRelaxNGPartitionPtr partitions =
NULL;
4223 xmlRelaxNGInterleaveGroupPtr
group;
4228 int is_determinist = 1;
4234 if (ctxt->nbErrors != 0)
4243 groups = (xmlRelaxNGInterleaveGroupPtr *)
4244 xmlMalloc(nbchild *
sizeof(xmlRelaxNGInterleaveGroupPtr));
4249 groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr)
4250 xmlMalloc(
sizeof(xmlRelaxNGInterleaveGroup));
4253 if (
cur->type == XML_RELAXNG_TEXT)
4256 groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt,
cur, 2);
4257 groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt,
cur, 1);
4265 partitions = (xmlRelaxNGPartitionPtr)
4267 if (partitions ==
NULL)
4269 memset(partitions, 0,
sizeof(xmlRelaxNGPartition));
4270 partitions->nbgroups = nbgroups;
4272 for (
i = 0;
i < nbgroups;
i++) {
4274 for (
j =
i + 1;
j < nbgroups;
j++) {
4278 ret = xmlRelaxNGCompareElemDefLists(ctxt,
group->defs,
4282 "Element or text conflicts in interleave\n",
4285 ret = xmlRelaxNGCompareElemDefLists(ctxt,
group->attrs,
4289 "Attributes conflicts in interleave\n",
NULL,
4294 if ((tmp !=
NULL) && (*tmp !=
NULL)) {
4295 while (*tmp !=
NULL) {
4296 if ((*tmp)->type == XML_RELAXNG_TEXT) {
4301 is_determinist = -1;
4302 }
else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
4303 ((*tmp)->name !=
NULL)) {
4304 if (((*tmp)->ns ==
NULL) || ((*tmp)->ns[0] == 0))
4310 (*tmp)->name, (*tmp)->ns,
4313 is_determinist = -1;
4314 }
else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
4315 if (((*tmp)->ns ==
NULL) || ((*tmp)->ns[0] == 0))
4323 if ((*tmp)->nameClass !=
NULL)
4326 is_determinist = -1;
4328 is_determinist = -1;
4336 partitions->groups =
groups;
4341 def->data = partitions;
4343 def->dflags |= IS_MIXED;
4344 if (is_determinist == 1)
4345 partitions->flags = IS_DETERMINIST;
4346 if (is_determinist == 2)
4347 partitions->flags = IS_DETERMINIST | IS_NEEDCHECK;
4351 xmlRngPErrMemory(ctxt,
"in interleave computation\n");
4353 for (
i = 0;
i < nbgroups;
i++)
4361 xmlRelaxNGFreePartition(partitions);
4373static xmlRelaxNGDefinePtr
4374xmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
4376 xmlRelaxNGDefinePtr def =
NULL;
4380 def = xmlRelaxNGNewDefine(ctxt,
node);
4384 def->type = XML_RELAXNG_INTERLEAVE;
4386 if (ctxt->interleaves ==
NULL)
4388 if (ctxt->interleaves ==
NULL) {
4389 xmlRngPErrMemory(ctxt,
"create interleaves\n");
4393 snprintf(
name, 32,
"interleave%d", ctxt->nbInterleaves++);
4396 "Failed to add %s to hash table\n",
4403 "Element interleave is empty\n",
NULL,
NULL);
4406 if (IS_RELAXNG(
child,
"element")) {
4407 cur = xmlRelaxNGParseElement(ctxt,
child);
4409 cur = xmlRelaxNGParsePattern(ctxt,
child);
4436xmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
4438 xmlRelaxNGIncludePtr incl;
4445 "Include node has no data\n",
NULL,
NULL);
4448 root = xmlDocGetRootElement(incl->doc);
4456 "Include document root is not a grammar\n",
NULL,
NULL);
4464 tmp = xmlRelaxNGParseGrammarContent(ctxt,
root->children);
4469 tmp = xmlRelaxNGParseGrammarContent(ctxt,
node->children);
4486xmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
4490 xmlRelaxNGDefinePtr def;
4496 "define has no name\n",
NULL,
NULL);
4498 xmlRelaxNGNormExtSpace(
name);
4499 if (xmlValidateNCName(
name, 0)) {
4501 "define name '%s' is not an NCName\n",
name,
NULL);
4503 def = xmlRelaxNGNewDefine(ctxt,
node);
4508 def->type = XML_RELAXNG_DEF;
4512 "define has no children\n",
NULL,
NULL);
4514 olddefine = ctxt->define;
4515 ctxt->define =
name;
4517 xmlRelaxNGParsePatterns(ctxt,
node->children, 0);
4518 ctxt->define = olddefine;
4520 if (ctxt->grammar->defs ==
NULL)
4522 if (ctxt->grammar->defs ==
NULL) {
4524 "Could not create definition hash\n",
NULL,
NULL);
4529 xmlRelaxNGDefinePtr prev;
4534 "Internal error on define aggregation of %s\n",
4538 while (prev->nextHash !=
NULL)
4539 prev = prev->nextHash;
4540 prev->nextHash = def;
4557xmlRelaxNGParseImportRef(
void *payload,
void *
data,
const xmlChar *
name) {
4558 xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr)
data;
4559 xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload;
4562 def->dflags |= IS_EXTERNAL_REF;
4566 xmlRelaxNGDefinePtr prev;
4568 prev = (xmlRelaxNGDefinePtr)
4571 if (def->name !=
NULL) {
4573 "Error refs definitions '%s'\n",
4577 "Error refs definitions\n",
4581 def->nextHash = prev->nextHash;
4582 prev->nextHash = def;
4597xmlRelaxNGParseImportRefs(xmlRelaxNGParserCtxtPtr ctxt,
4598 xmlRelaxNGGrammarPtr grammar) {
4599 if ((ctxt ==
NULL) || (grammar ==
NULL) || (ctxt->grammar ==
NULL))
4601 if (grammar->refs ==
NULL)
4603 if (ctxt->grammar->refs ==
NULL)
4605 if (ctxt->grammar->refs ==
NULL) {
4607 "Could not create references hash\n",
NULL,
NULL);
4610 xmlHashScan(grammar->refs, xmlRelaxNGParseImportRef, ctxt);
4623static xmlRelaxNGDefinePtr
4624xmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
4626 xmlRelaxNGDocumentPtr docu;
4627 xmlNodePtr
root, tmp;
4629 int newNs = 0, oldflags;
4630 xmlRelaxNGDefinePtr def;
4634 def = xmlRelaxNGNewDefine(ctxt,
node);
4637 def->type = XML_RELAXNG_EXTERNALREF;
4639 if (docu->content ==
NULL) {
4643 root = xmlDocGetRootElement(docu->doc);
4646 "xmlRelaxNGParse: %s is empty\n", ctxt->URL,
4656 while ((tmp !=
NULL) && (tmp->type == XML_ELEMENT_NODE)) {
4675 oldflags = ctxt->flags;
4676 ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF;
4677 docu->schema = xmlRelaxNGParseDocument(ctxt,
root);
4678 ctxt->flags = oldflags;
4679 if ((docu->schema !=
NULL) &&
4680 (docu->schema->topgrammar !=
NULL)) {
4681 docu->content = docu->schema->topgrammar->start;
4682 if (docu->schema->topgrammar->refs)
4683 xmlRelaxNGParseImportRefs(ctxt, docu->schema->topgrammar);
4693 def->content = docu->content;
4710static xmlRelaxNGDefinePtr
4711xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
4713 xmlRelaxNGDefinePtr def =
NULL;
4718 if (IS_RELAXNG(
node,
"element")) {
4719 def = xmlRelaxNGParseElement(ctxt,
node);
4720 }
else if (IS_RELAXNG(
node,
"attribute")) {
4721 def = xmlRelaxNGParseAttribute(ctxt,
node);
4722 }
else if (IS_RELAXNG(
node,
"empty")) {
4723 def = xmlRelaxNGNewDefine(ctxt,
node);
4726 def->type = XML_RELAXNG_EMPTY;
4729 "empty: had a child node\n",
NULL,
NULL);
4731 }
else if (IS_RELAXNG(
node,
"text")) {
4732 def = xmlRelaxNGNewDefine(ctxt,
node);
4735 def->type = XML_RELAXNG_TEXT;
4738 "text: had a child node\n",
NULL,
NULL);
4740 }
else if (IS_RELAXNG(
node,
"zeroOrMore")) {
4741 def = xmlRelaxNGNewDefine(ctxt,
node);
4744 def->type = XML_RELAXNG_ZEROORMORE;
4747 "Element %s is empty\n",
node->name,
NULL);
4750 xmlRelaxNGParsePatterns(ctxt,
node->children, 1);
4752 }
else if (IS_RELAXNG(
node,
"oneOrMore")) {
4753 def = xmlRelaxNGNewDefine(ctxt,
node);
4756 def->type = XML_RELAXNG_ONEORMORE;
4759 "Element %s is empty\n",
node->name,
NULL);
4762 xmlRelaxNGParsePatterns(ctxt,
node->children, 1);
4764 }
else if (IS_RELAXNG(
node,
"optional")) {
4765 def = xmlRelaxNGNewDefine(ctxt,
node);
4768 def->type = XML_RELAXNG_OPTIONAL;
4771 "Element %s is empty\n",
node->name,
NULL);
4774 xmlRelaxNGParsePatterns(ctxt,
node->children, 1);
4776 }
else if (IS_RELAXNG(
node,
"choice")) {
4777 def = xmlRelaxNGNewDefine(ctxt,
node);
4780 def->type = XML_RELAXNG_CHOICE;
4783 "Element %s is empty\n",
node->name,
NULL);
4786 xmlRelaxNGParsePatterns(ctxt,
node->children, 0);
4788 }
else if (IS_RELAXNG(
node,
"group")) {
4789 def = xmlRelaxNGNewDefine(ctxt,
node);
4792 def->type = XML_RELAXNG_GROUP;
4795 "Element %s is empty\n",
node->name,
NULL);
4798 xmlRelaxNGParsePatterns(ctxt,
node->children, 0);
4800 }
else if (IS_RELAXNG(
node,
"ref")) {
4801 def = xmlRelaxNGNewDefine(ctxt,
node);
4804 def->type = XML_RELAXNG_REF;
4806 if (def->name ==
NULL) {
4810 xmlRelaxNGNormExtSpace(def->name);
4811 if (xmlValidateNCName(def->name, 0)) {
4813 "ref name '%s' is not an NCName\n", def->name,
4821 if (ctxt->grammar->refs ==
NULL)
4823 if (ctxt->grammar->refs ==
NULL) {
4825 "Could not create references hash\n",
NULL,
NULL);
4832 xmlRelaxNGDefinePtr prev;
4834 prev = (xmlRelaxNGDefinePtr)
4837 if (def->name !=
NULL) {
4839 "Error refs definitions '%s'\n",
4843 "Error refs definitions\n",
4848 def->nextHash = prev->nextHash;
4849 prev->nextHash = def;
4853 }
else if (IS_RELAXNG(
node,
"data")) {
4854 def = xmlRelaxNGParseData(ctxt,
node);
4855 }
else if (IS_RELAXNG(
node,
"value")) {
4856 def = xmlRelaxNGParseValue(ctxt,
node);
4857 }
else if (IS_RELAXNG(
node,
"list")) {
4858 def = xmlRelaxNGNewDefine(ctxt,
node);
4861 def->type = XML_RELAXNG_LIST;
4864 "Element %s is empty\n",
node->name,
NULL);
4867 xmlRelaxNGParsePatterns(ctxt,
node->children, 0);
4869 }
else if (IS_RELAXNG(
node,
"interleave")) {
4870 def = xmlRelaxNGParseInterleave(ctxt,
node);
4871 }
else if (IS_RELAXNG(
node,
"externalRef")) {
4872 def = xmlRelaxNGProcessExternalRef(ctxt,
node);
4873 }
else if (IS_RELAXNG(
node,
"notAllowed")) {
4874 def = xmlRelaxNGNewDefine(ctxt,
node);
4877 def->type = XML_RELAXNG_NOT_ALLOWED;
4880 "xmlRelaxNGParse: notAllowed element is not empty\n",
4883 }
else if (IS_RELAXNG(
node,
"grammar")) {
4884 xmlRelaxNGGrammarPtr grammar, old;
4885 xmlRelaxNGGrammarPtr oldparent;
4887 oldparent = ctxt->parentgrammar;
4888 old = ctxt->grammar;
4889 ctxt->parentgrammar = old;
4890 grammar = xmlRelaxNGParseGrammar(ctxt,
node->children);
4892 ctxt->grammar = old;
4893 ctxt->parentgrammar = oldparent;
4895 if (grammar !=
NULL) {
4896 grammar->next = old->next;
4897 old->next = grammar;
4901 if (grammar !=
NULL)
4902 def = grammar->start;
4905 }
else if (IS_RELAXNG(
node,
"parentRef")) {
4906 if (ctxt->parentgrammar ==
NULL) {
4908 "Use of parentRef without a parent grammar\n",
NULL,
4912 def = xmlRelaxNGNewDefine(ctxt,
node);
4915 def->type = XML_RELAXNG_PARENTREF;
4917 if (def->name ==
NULL) {
4919 "parentRef has no name\n",
NULL,
NULL);
4921 xmlRelaxNGNormExtSpace(def->name);
4922 if (xmlValidateNCName(def->name, 0)) {
4924 "parentRef name '%s' is not an NCName\n",
4930 "parentRef is not empty\n",
NULL,
NULL);
4932 if (ctxt->parentgrammar->refs ==
NULL)
4934 if (ctxt->parentgrammar->refs ==
NULL) {
4936 "Could not create references hash\n",
NULL,
NULL);
4938 }
else if (def->name !=
NULL) {
4944 xmlRelaxNGDefinePtr prev;
4946 prev = (xmlRelaxNGDefinePtr)
4950 "Internal error parentRef definitions '%s'\n",
4954 def->nextHash = prev->nextHash;
4955 prev->nextHash = def;
4959 }
else if (IS_RELAXNG(
node,
"mixed")) {
4965 def = xmlRelaxNGParseInterleave(ctxt,
node);
4967 xmlRelaxNGDefinePtr tmp;
4969 if ((def->content !=
NULL) && (def->content->next !=
NULL)) {
4970 tmp = xmlRelaxNGNewDefine(ctxt,
node);
4972 tmp->type = XML_RELAXNG_GROUP;
4973 tmp->content = def->content;
4978 tmp = xmlRelaxNGNewDefine(ctxt,
node);
4981 tmp->type = XML_RELAXNG_TEXT;
4982 tmp->next = def->content;
4988 "Unexpected node %s is not a pattern\n",
node->name,
5004static xmlRelaxNGDefinePtr
5005xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
5007 xmlRelaxNGDefinePtr
ret,
cur;
5011 ret = xmlRelaxNGNewDefine(ctxt,
node);
5014 ret->type = XML_RELAXNG_ATTRIBUTE;
5015 ret->parent = ctxt->def;
5019 "xmlRelaxNGParseattribute: attribute has no children\n",
5023 old_flags = ctxt->flags;
5024 ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE;
5030 cur = xmlRelaxNGParsePattern(ctxt,
child);
5032 switch (
cur->type) {
5033 case XML_RELAXNG_EMPTY:
5034 case XML_RELAXNG_NOT_ALLOWED:
5035 case XML_RELAXNG_TEXT:
5036 case XML_RELAXNG_ELEMENT:
5037 case XML_RELAXNG_DATATYPE:
5038 case XML_RELAXNG_VALUE:
5039 case XML_RELAXNG_LIST:
5040 case XML_RELAXNG_REF:
5041 case XML_RELAXNG_PARENTREF:
5042 case XML_RELAXNG_EXTERNALREF:
5043 case XML_RELAXNG_DEF:
5044 case XML_RELAXNG_ONEORMORE:
5045 case XML_RELAXNG_ZEROORMORE:
5046 case XML_RELAXNG_OPTIONAL:
5047 case XML_RELAXNG_CHOICE:
5048 case XML_RELAXNG_GROUP:
5049 case XML_RELAXNG_INTERLEAVE:
5050 case XML_RELAXNG_ATTRIBUTE:
5054 case XML_RELAXNG_START:
5055 case XML_RELAXNG_PARAM:
5056 case XML_RELAXNG_EXCEPT:
5058 "attribute has invalid content\n",
NULL,
5061 case XML_RELAXNG_NOOP:
5063 "RNG Internal error, noop found in attribute\n",
5072 "attribute has multiple children\n",
NULL,
NULL);
5074 ctxt->flags = old_flags;
5088static xmlRelaxNGDefinePtr
5089xmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt,
5095 if (!IS_RELAXNG(
node,
"except")) {
5097 "Expecting an except node\n",
NULL,
NULL);
5102 "exceptNameClass allows only a single except node\n",
5111 ret = xmlRelaxNGNewDefine(ctxt,
node);
5114 ret->type = XML_RELAXNG_EXCEPT;
5117 cur = xmlRelaxNGNewDefine(ctxt,
child);
5121 cur->type = XML_RELAXNG_ATTRIBUTE;
5123 cur->type = XML_RELAXNG_ELEMENT;
5125 if (xmlRelaxNGParseNameClass(ctxt,
child,
cur) !=
NULL) {
5149static xmlRelaxNGDefinePtr
5150xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node,
5151 xmlRelaxNGDefinePtr def)
5153 xmlRelaxNGDefinePtr
ret, tmp;
5157 if ((IS_RELAXNG(
node,
"name")) || (IS_RELAXNG(
node,
"anyName")) ||
5158 (IS_RELAXNG(
node,
"nsName"))) {
5159 if ((def->type != XML_RELAXNG_ELEMENT) &&
5160 (def->type != XML_RELAXNG_ATTRIBUTE)) {
5161 ret = xmlRelaxNGNewDefine(ctxt,
node);
5165 if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE)
5166 ret->type = XML_RELAXNG_ATTRIBUTE;
5168 ret->type = XML_RELAXNG_ELEMENT;
5171 if (IS_RELAXNG(
node,
"name")) {
5172 val = xmlNodeGetContent(
node);
5173 xmlRelaxNGNormExtSpace(
val);
5174 if (xmlValidateNCName(
val, 0)) {
5177 "Element %s name '%s' is not an NCName\n",
5181 "name '%s' is not an NCName\n",
5187 if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5191 "Attribute with namespace '%s' is not allowed\n",
5194 if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5198 "Attribute with QName 'xmlns' is not allowed\n",
5201 }
else if (IS_RELAXNG(
node,
"anyName")) {
5206 xmlRelaxNGParseExceptNameClass(ctxt,
node->children,
5208 XML_RELAXNG_ATTRIBUTE));
5210 }
else if (IS_RELAXNG(
node,
"nsName")) {
5215 "nsName has no ns attribute\n",
NULL,
NULL);
5217 if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5220 (
ret->ns,
BAD_CAST "http://www.w3.org/2000/xmlns"))) {
5222 "Attribute with namespace '%s' is not allowed\n",
5227 xmlRelaxNGParseExceptNameClass(ctxt,
node->children,
5229 XML_RELAXNG_ATTRIBUTE));
5231 }
else if (IS_RELAXNG(
node,
"choice")) {
5235 if (def->type == XML_RELAXNG_CHOICE) {
5238 ret = xmlRelaxNGNewDefine(ctxt,
node);
5242 ret->type = XML_RELAXNG_CHOICE;
5247 "Element choice is empty\n",
NULL,
NULL);
5252 tmp = xmlRelaxNGParseNameClass(ctxt,
child,
ret);
5266 "expecting name, anyName, nsName or choice : got %s\n",
5272 if (def->nameClass ==
NULL) {
5273 def->nameClass =
ret;
5275 tmp = def->nameClass;
5276 while (tmp->next !=
NULL) {
5294static xmlRelaxNGDefinePtr
5295xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
5301 ret = xmlRelaxNGNewDefine(ctxt,
node);
5304 ret->type = XML_RELAXNG_ELEMENT;
5305 ret->parent = ctxt->def;
5309 "xmlRelaxNGParseElement: element has no children\n",
5319 "xmlRelaxNGParseElement: element has no content\n",
5323 olddefine = ctxt->define;
5324 ctxt->define =
NULL;
5327 cur = xmlRelaxNGParsePattern(ctxt,
child);
5330 switch (
cur->type) {
5331 case XML_RELAXNG_EMPTY:
5332 case XML_RELAXNG_NOT_ALLOWED:
5333 case XML_RELAXNG_TEXT:
5334 case XML_RELAXNG_ELEMENT:
5335 case XML_RELAXNG_DATATYPE:
5336 case XML_RELAXNG_VALUE:
5337 case XML_RELAXNG_LIST:
5338 case XML_RELAXNG_REF:
5339 case XML_RELAXNG_PARENTREF:
5340 case XML_RELAXNG_EXTERNALREF:
5341 case XML_RELAXNG_DEF:
5342 case XML_RELAXNG_ZEROORMORE:
5343 case XML_RELAXNG_ONEORMORE:
5344 case XML_RELAXNG_OPTIONAL:
5345 case XML_RELAXNG_CHOICE:
5346 case XML_RELAXNG_GROUP:
5347 case XML_RELAXNG_INTERLEAVE:
5351 if ((
last->type == XML_RELAXNG_ELEMENT) &&
5353 ret->content = xmlRelaxNGNewDefine(ctxt,
node);
5355 ret->content->type = XML_RELAXNG_GROUP;
5365 case XML_RELAXNG_ATTRIBUTE:
5369 case XML_RELAXNG_START:
5371 "RNG Internal error, start found in element\n",
5374 case XML_RELAXNG_PARAM:
5376 "RNG Internal error, param found in element\n",
5379 case XML_RELAXNG_EXCEPT:
5381 "RNG Internal error, except found in element\n",
5384 case XML_RELAXNG_NOOP:
5386 "RNG Internal error, noop found in element\n",
5393 ctxt->define = olddefine;
5407static xmlRelaxNGDefinePtr
5408xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes,
5414 while (nodes !=
NULL) {
5415 if (IS_RELAXNG(nodes,
"element")) {
5416 cur = xmlRelaxNGParseElement(ctxt, nodes);
5422 if ((
group == 1) && (def->type == XML_RELAXNG_ELEMENT) &&
5424 def = xmlRelaxNGNewDefine(ctxt, nodes);
5427 def->type = XML_RELAXNG_GROUP;
5428 def->content =
last;
5435 cur = xmlRelaxNGParsePattern(ctxt, nodes);
5445 nodes = nodes->next;
5460xmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
5463 xmlRelaxNGDefinePtr def =
NULL,
last;
5465 if (nodes ==
NULL) {
5470 if (IS_RELAXNG(nodes,
"empty")) {
5471 def = xmlRelaxNGNewDefine(ctxt, nodes);
5474 def->type = XML_RELAXNG_EMPTY;
5475 if (nodes->children !=
NULL) {
5477 "element empty is not empty\n",
NULL,
NULL);
5479 }
else if (IS_RELAXNG(nodes,
"notAllowed")) {
5480 def = xmlRelaxNGNewDefine(ctxt, nodes);
5483 def->type = XML_RELAXNG_NOT_ALLOWED;
5484 if (nodes->children !=
NULL) {
5486 "element notAllowed is not empty\n",
NULL,
NULL);
5489 def = xmlRelaxNGParsePatterns(ctxt, nodes, 1);
5491 if (ctxt->grammar->start !=
NULL) {
5492 last = ctxt->grammar->start;
5497 ctxt->grammar->start = def;
5499 nodes = nodes->next;
5500 if (nodes !=
NULL) {
5502 "start more than one children\n",
NULL,
NULL);
5518xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
5523 if (nodes ==
NULL) {
5525 "grammar has no children\n",
NULL,
NULL);
5528 while (nodes !=
NULL) {
5529 if (IS_RELAXNG(nodes,
"start")) {
5530 if (nodes->children ==
NULL) {
5532 "start has no children\n",
NULL,
NULL);
5534 tmp = xmlRelaxNGParseStart(ctxt, nodes->children);
5538 }
else if (IS_RELAXNG(nodes,
"define")) {
5539 tmp = xmlRelaxNGParseDefine(ctxt, nodes);
5542 }
else if (IS_RELAXNG(nodes,
"include")) {
5543 tmp = xmlRelaxNGParseInclude(ctxt, nodes);
5548 "grammar has unexpected child %s\n", nodes->name,
5552 nodes = nodes->next;
5567xmlRelaxNGCheckReference(
void *payload,
void *
data,
const xmlChar *
name)
5569 xmlRelaxNGDefinePtr
ref = (xmlRelaxNGDefinePtr) payload;
5570 xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr)
data;
5571 xmlRelaxNGGrammarPtr grammar;
5572 xmlRelaxNGDefinePtr def,
cur;
5577 if (
ref->dflags & IS_EXTERNAL_REF)
5580 grammar = ctxt->grammar;
5581 if (grammar ==
NULL) {
5583 "Internal error: no grammar in CheckReference %s\n",
5589 "Internal error: reference has content in CheckReference %s\n",
5593 if (grammar->defs !=
NULL) {
5603 "Reference %s has no matching definition\n",
name,
5608 "Reference %s has no matching definition\n",
name,
5623xmlRelaxNGCheckCombine(
void *payload,
void *
data,
const xmlChar *
name)
5625 xmlRelaxNGDefinePtr
define = (xmlRelaxNGDefinePtr) payload;
5626 xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr)
data;
5628 int choiceOrInterleave = -1;
5630 xmlRelaxNGDefinePtr
cur,
last, tmp, tmp2;
5636 combine = xmlGetProp(
cur->node,
BAD_CAST "combine");
5637 if (combine !=
NULL) {
5639 if (choiceOrInterleave == -1)
5640 choiceOrInterleave = 1;
5641 else if (choiceOrInterleave == 0) {
5643 "Defines for %s use both 'choice' and 'interleave'\n",
5647 if (choiceOrInterleave == -1)
5648 choiceOrInterleave = 0;
5649 else if (choiceOrInterleave == 1) {
5651 "Defines for %s use both 'choice' and 'interleave'\n",
5656 "Defines for %s use unknown combine value '%s''\n",
5665 "Some defines for %s needs the combine attribute\n",
5672 if (choiceOrInterleave == -1)
5673 choiceOrInterleave = 0;
5674 cur = xmlRelaxNGNewDefine(ctxt,
define->node);
5677 if (choiceOrInterleave == 0)
5678 cur->type = XML_RELAXNG_INTERLEAVE;
5680 cur->type = XML_RELAXNG_CHOICE;
5683 while (tmp !=
NULL) {
5684 if (tmp->content !=
NULL) {
5685 if (tmp->content->next !=
NULL) {
5689 tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node);
5692 tmp2->type = XML_RELAXNG_GROUP;
5693 tmp2->content = tmp->content;
5695 tmp2 = tmp->content;
5698 cur->content = tmp2;
5705 tmp = tmp->nextHash;
5708 if (choiceOrInterleave == 0) {
5709 if (ctxt->interleaves ==
NULL)
5711 if (ctxt->interleaves ==
NULL) {
5713 "Failed to create interleaves hash table\n",
NULL,
5718 snprintf(tmpname, 32,
"interleave%d", ctxt->nbInterleaves++);
5722 "Failed to add %s to hash table\n",
5738xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
5739 xmlRelaxNGGrammarPtr grammar)
5741 xmlRelaxNGDefinePtr starts;
5743 int choiceOrInterleave = -1;
5745 xmlRelaxNGDefinePtr
cur;
5747 starts = grammar->start;
5748 if ((starts ==
NULL) || (starts->next ==
NULL))
5756 "Internal error: start element not found\n",
NULL,
5759 combine = xmlGetProp(
cur->node->parent,
BAD_CAST "combine");
5762 if (combine !=
NULL) {
5764 if (choiceOrInterleave == -1)
5765 choiceOrInterleave = 1;
5766 else if (choiceOrInterleave == 0) {
5768 "<start> use both 'choice' and 'interleave'\n",
5772 if (choiceOrInterleave == -1)
5773 choiceOrInterleave = 0;
5774 else if (choiceOrInterleave == 1) {
5776 "<start> use both 'choice' and 'interleave'\n",
5781 "<start> uses unknown combine value '%s''\n",
5790 "Some <start> element miss the combine attribute\n",
5797 if (choiceOrInterleave == -1)
5798 choiceOrInterleave = 0;
5799 cur = xmlRelaxNGNewDefine(ctxt, starts->node);
5802 if (choiceOrInterleave == 0)
5803 cur->type = XML_RELAXNG_INTERLEAVE;
5805 cur->type = XML_RELAXNG_CHOICE;
5806 cur->content = grammar->start;
5807 grammar->start =
cur;
5808 if (choiceOrInterleave == 0) {
5809 if (ctxt->interleaves ==
NULL)
5811 if (ctxt->interleaves ==
NULL) {
5813 "Failed to create interleaves hash table\n",
NULL,
5818 snprintf(tmpname, 32,
"interleave%d", ctxt->nbInterleaves++);
5822 "Failed to add %s to hash table\n",
5840xmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt,
5841 xmlRelaxNGDefinePtr
cur,
int depth)
5846 if ((
cur->type == XML_RELAXNG_REF) ||
5847 (
cur->type == XML_RELAXNG_PARENTREF)) {
5848 if (
cur->depth == -1) {
5850 ret = xmlRelaxNGCheckCycles(ctxt,
cur->content,
depth);
5854 "Detected a cycle in %s references\n",
5858 }
else if (
cur->type == XML_RELAXNG_ELEMENT) {
5859 ret = xmlRelaxNGCheckCycles(ctxt,
cur->content,
depth + 1);
5861 ret = xmlRelaxNGCheckCycles(ctxt,
cur->content,
depth);
5879static xmlRelaxNGDefinePtr
5881 xmlRelaxNGDefinePtr
cur,
5882 xmlRelaxNGDefinePtr
parent, xmlRelaxNGDefinePtr prev)
5885 prev->next =
cur->next;
5895 cur->type = XML_RELAXNG_NOOP;
5910xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
5911 xmlRelaxNGDefinePtr
cur, xmlRelaxNGDefinePtr
parent)
5913 xmlRelaxNGDefinePtr prev =
NULL;
5916 if ((
cur->type == XML_RELAXNG_REF) ||
5917 (
cur->type == XML_RELAXNG_PARENTREF)) {
5918 if (
cur->depth != -3) {
5920 xmlRelaxNGSimplify(ctxt,
cur->content,
cur);
5922 }
else if (
cur->type == XML_RELAXNG_NOT_ALLOWED) {
5925 ((
parent->type == XML_RELAXNG_ATTRIBUTE) ||
5926 (
parent->type == XML_RELAXNG_LIST) ||
5927 (
parent->type == XML_RELAXNG_GROUP) ||
5928 (
parent->type == XML_RELAXNG_INTERLEAVE) ||
5929 (
parent->type == XML_RELAXNG_ONEORMORE) ||
5930 (
parent->type == XML_RELAXNG_ZEROORMORE))) {
5931 parent->type = XML_RELAXNG_NOT_ALLOWED;
5935 prev = xmlRelaxNGTryUnlink(ctxt,
cur,
parent, prev);
5938 }
else if (
cur->type == XML_RELAXNG_EMPTY) {
5941 ((
parent->type == XML_RELAXNG_ONEORMORE) ||
5942 (
parent->type == XML_RELAXNG_ZEROORMORE))) {
5943 parent->type = XML_RELAXNG_EMPTY;
5947 ((
parent->type == XML_RELAXNG_GROUP) ||
5948 (
parent->type == XML_RELAXNG_INTERLEAVE))) {
5949 prev = xmlRelaxNGTryUnlink(ctxt,
cur,
parent, prev);
5955 xmlRelaxNGSimplify(ctxt,
cur->content,
cur);
5956 if ((
cur->type != XML_RELAXNG_VALUE) && (
cur->attrs !=
NULL))
5957 xmlRelaxNGSimplify(ctxt,
cur->attrs,
cur);
5959 xmlRelaxNGSimplify(ctxt,
cur->nameClass,
cur);
5964 if (
cur->type == XML_RELAXNG_ELEMENT) {
5966 xmlRelaxNGDefinePtr tmp, pre;
5968 while (
cur->content !=
NULL) {
5970 xmlRelaxNGGenerateAttributes(ctxt,
cur->content);
5971 if (attronly == 1) {
5976 cur->content = tmp->next;
5977 tmp->next =
cur->attrs;
5987 while ((pre !=
NULL) && (pre->next !=
NULL)) {
5989 attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp);
5990 if (attronly == 1) {
5994 pre->next = tmp->next;
5995 tmp->next =
cur->attrs;
6005 if ((
cur->type == XML_RELAXNG_GROUP) ||
6006 (
cur->type == XML_RELAXNG_INTERLEAVE)) {
6008 cur->type = XML_RELAXNG_EMPTY;
6009 else if (
cur->content->next ==
NULL) {
6011 cur->type = XML_RELAXNG_NOOP;
6012 }
else if (prev ==
NULL) {
6014 cur->content->next =
cur->next;
6017 cur->content->next =
cur->next;
6018 prev->next =
cur->content;
6026 if ((
cur->type == XML_RELAXNG_EXCEPT) &&
6028 (
cur->content->type == XML_RELAXNG_NOT_ALLOWED)) {
6029 prev = xmlRelaxNGTryUnlink(ctxt,
cur,
parent, prev);
6030 }
else if (
cur->type == XML_RELAXNG_NOT_ALLOWED) {
6032 ((
parent->type == XML_RELAXNG_ATTRIBUTE) ||
6033 (
parent->type == XML_RELAXNG_LIST) ||
6034 (
parent->type == XML_RELAXNG_GROUP) ||
6035 (
parent->type == XML_RELAXNG_INTERLEAVE) ||
6036 (
parent->type == XML_RELAXNG_ONEORMORE) ||
6037 (
parent->type == XML_RELAXNG_ZEROORMORE))) {
6038 parent->type = XML_RELAXNG_NOT_ALLOWED;
6042 (
parent->type == XML_RELAXNG_CHOICE)) {
6043 prev = xmlRelaxNGTryUnlink(ctxt,
cur,
parent, prev);
6046 }
else if (
cur->type == XML_RELAXNG_EMPTY) {
6048 ((
parent->type == XML_RELAXNG_ONEORMORE) ||
6049 (
parent->type == XML_RELAXNG_ZEROORMORE))) {
6050 parent->type = XML_RELAXNG_EMPTY;
6054 ((
parent->type == XML_RELAXNG_GROUP) ||
6055 (
parent->type == XML_RELAXNG_INTERLEAVE) ||
6056 (
parent->type == XML_RELAXNG_CHOICE))) {
6057 prev = xmlRelaxNGTryUnlink(ctxt,
cur,
parent, prev);
6077static xmlRelaxNGContentType
6078xmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1,
6079 xmlRelaxNGContentType ct2)
6081 if ((ct1 == XML_RELAXNG_CONTENT_ERROR) ||
6082 (ct2 == XML_RELAXNG_CONTENT_ERROR))
6083 return (XML_RELAXNG_CONTENT_ERROR);
6084 if (ct1 == XML_RELAXNG_CONTENT_EMPTY)
6086 if (ct2 == XML_RELAXNG_CONTENT_EMPTY)
6088 if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) &&
6089 (ct2 == XML_RELAXNG_CONTENT_COMPLEX))
6090 return (XML_RELAXNG_CONTENT_COMPLEX);
6091 return (XML_RELAXNG_CONTENT_ERROR);
6103static xmlRelaxNGContentType
6104xmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1,
6105 xmlRelaxNGContentType ct2)
6107 if ((ct1 == XML_RELAXNG_CONTENT_ERROR) ||
6108 (ct2 == XML_RELAXNG_CONTENT_ERROR))
6109 return (XML_RELAXNG_CONTENT_ERROR);
6110 if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) ||
6111 (ct2 == XML_RELAXNG_CONTENT_SIMPLE))
6112 return (XML_RELAXNG_CONTENT_SIMPLE);
6113 if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) ||
6114 (ct2 == XML_RELAXNG_CONTENT_COMPLEX))
6115 return (XML_RELAXNG_CONTENT_COMPLEX);
6116 return (XML_RELAXNG_CONTENT_EMPTY);
6130static xmlRelaxNGContentType
6131xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt,
6132 xmlRelaxNGDefinePtr
cur,
int flags,
6133 xmlRelaxNGType ptype)
6136 xmlRelaxNGContentType
ret, tmp,
val = XML_RELAXNG_CONTENT_EMPTY;
6139 ret = XML_RELAXNG_CONTENT_EMPTY;
6140 if ((
cur->type == XML_RELAXNG_REF) ||
6141 (
cur->type == XML_RELAXNG_PARENTREF)) {
6148 if (
flags & XML_RELAXNG_IN_LIST) {
6150 "Found forbidden pattern list//ref\n",
NULL,
6154 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6156 "Found forbidden pattern data/except//ref\n",
6160 if (
cur->type == XML_RELAXNG_PARENTREF)
6162 "Internal found no define for parent refs\n",
6166 "Internal found no define for ref %s\n",
6169 if (
cur->depth > -4) {
6171 ret = xmlRelaxNGCheckRules(ctxt,
cur->content,
6174 }
else if (
cur->depth == -4) {
6175 ret = XML_RELAXNG_CONTENT_COMPLEX;
6177 ret = (xmlRelaxNGContentType) (
cur->depth + 15);
6179 }
else if (
cur->type == XML_RELAXNG_ELEMENT) {
6183 xmlRelaxNGCheckGroupAttrs(ctxt,
cur);
6184 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6186 "Found forbidden pattern data/except//element(ref)\n",
6189 if (
flags & XML_RELAXNG_IN_LIST) {
6191 "Found forbidden pattern list//element(ref)\n",
6194 if (
flags & XML_RELAXNG_IN_ATTRIBUTE) {
6196 "Found forbidden pattern attribute//element(ref)\n",
6199 if (
flags & XML_RELAXNG_IN_ATTRIBUTE) {
6201 "Found forbidden pattern attribute//element(ref)\n",
6210 xmlRelaxNGCheckRules(ctxt,
cur->attrs, nflags,
cur->type);
6211 if (
ret != XML_RELAXNG_CONTENT_EMPTY) {
6213 "Element %s attributes have a content type error\n",
6217 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
6219 if (
ret == XML_RELAXNG_CONTENT_ERROR) {
6221 "Element %s has a content type error\n",
6224 ret = XML_RELAXNG_CONTENT_COMPLEX;
6226 }
else if (
cur->type == XML_RELAXNG_ATTRIBUTE) {
6227 if (
flags & XML_RELAXNG_IN_ATTRIBUTE) {
6229 "Found forbidden pattern attribute//attribute\n",
6232 if (
flags & XML_RELAXNG_IN_LIST) {
6234 "Found forbidden pattern list//attribute\n",
6237 if (
flags & XML_RELAXNG_IN_OOMGROUP) {
6239 "Found forbidden pattern oneOrMore//group//attribute\n",
6242 if (
flags & XML_RELAXNG_IN_OOMINTERLEAVE) {
6244 "Found forbidden pattern oneOrMore//interleave//attribute\n",
6247 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6249 "Found forbidden pattern data/except//attribute\n",
6252 if (
flags & XML_RELAXNG_IN_START) {
6254 "Found forbidden pattern start//attribute\n",
6257 if ((!(
flags & XML_RELAXNG_IN_ONEORMORE))
6264 "Found anyName attribute without oneOrMore ancestor\n",
6268 "Found nsName attribute without oneOrMore ancestor\n",
6272 nflags =
flags | XML_RELAXNG_IN_ATTRIBUTE;
6273 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
cur->type);
6274 ret = XML_RELAXNG_CONTENT_EMPTY;
6275 }
else if ((
cur->type == XML_RELAXNG_ONEORMORE) ||
6276 (
cur->type == XML_RELAXNG_ZEROORMORE)) {
6277 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6279 "Found forbidden pattern data/except//oneOrMore\n",
6282 if (
flags & XML_RELAXNG_IN_START) {
6284 "Found forbidden pattern start//oneOrMore\n",
6287 nflags =
flags | XML_RELAXNG_IN_ONEORMORE;
6289 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
6291 ret = xmlRelaxNGGroupContentType(
ret,
ret);
6292 }
else if (
cur->type == XML_RELAXNG_LIST) {
6293 if (
flags & XML_RELAXNG_IN_LIST) {
6295 "Found forbidden pattern list//list\n",
NULL,
6298 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6300 "Found forbidden pattern data/except//list\n",
6303 if (
flags & XML_RELAXNG_IN_START) {
6305 "Found forbidden pattern start//list\n",
NULL,
6308 nflags =
flags | XML_RELAXNG_IN_LIST;
6310 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
6312 }
else if (
cur->type == XML_RELAXNG_GROUP) {
6313 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6315 "Found forbidden pattern data/except//group\n",
6318 if (
flags & XML_RELAXNG_IN_START) {
6320 "Found forbidden pattern start//group\n",
NULL,
6323 if (
flags & XML_RELAXNG_IN_ONEORMORE)
6324 nflags =
flags | XML_RELAXNG_IN_OOMGROUP;
6328 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
6333 xmlRelaxNGCheckGroupAttrs(ctxt,
cur);
6334 }
else if (
cur->type == XML_RELAXNG_INTERLEAVE) {
6335 if (
flags & XML_RELAXNG_IN_LIST) {
6337 "Found forbidden pattern list//interleave\n",
6340 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6342 "Found forbidden pattern data/except//interleave\n",
6345 if (
flags & XML_RELAXNG_IN_START) {
6347 "Found forbidden pattern start//interleave\n",
6350 if (
flags & XML_RELAXNG_IN_ONEORMORE)
6351 nflags =
flags | XML_RELAXNG_IN_OOMINTERLEAVE;
6355 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
6357 }
else if (
cur->type == XML_RELAXNG_EXCEPT) {
6359 (
cur->parent->type == XML_RELAXNG_DATATYPE))
6360 nflags =
flags | XML_RELAXNG_IN_DATAEXCEPT;
6364 xmlRelaxNGCheckRules(ctxt,
cur->content, nflags,
6366 }
else if (
cur->type == XML_RELAXNG_DATATYPE) {
6367 if (
flags & XML_RELAXNG_IN_START) {
6369 "Found forbidden pattern start//data\n",
NULL,
6372 xmlRelaxNGCheckRules(ctxt,
cur->content,
flags,
cur->type);
6373 ret = XML_RELAXNG_CONTENT_SIMPLE;
6374 }
else if (
cur->type == XML_RELAXNG_VALUE) {
6375 if (
flags & XML_RELAXNG_IN_START) {
6377 "Found forbidden pattern start//value\n",
NULL,
6380 xmlRelaxNGCheckRules(ctxt,
cur->content,
flags,
cur->type);
6381 ret = XML_RELAXNG_CONTENT_SIMPLE;
6382 }
else if (
cur->type == XML_RELAXNG_TEXT) {
6383 if (
flags & XML_RELAXNG_IN_LIST) {
6385 "Found forbidden pattern list//text\n",
NULL,
6388 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6390 "Found forbidden pattern data/except//text\n",
6393 if (
flags & XML_RELAXNG_IN_START) {
6395 "Found forbidden pattern start//text\n",
NULL,
6398 ret = XML_RELAXNG_CONTENT_COMPLEX;
6399 }
else if (
cur->type == XML_RELAXNG_EMPTY) {
6400 if (
flags & XML_RELAXNG_IN_DATAEXCEPT) {
6402 "Found forbidden pattern data/except//empty\n",
6405 if (
flags & XML_RELAXNG_IN_START) {
6407 "Found forbidden pattern start//empty\n",
NULL,
6410 ret = XML_RELAXNG_CONTENT_EMPTY;
6411 }
else if (
cur->type == XML_RELAXNG_CHOICE) {
6412 xmlRelaxNGCheckChoiceDeterminism(ctxt,
cur);
6414 xmlRelaxNGCheckRules(ctxt,
cur->content,
flags,
cur->type);
6417 xmlRelaxNGCheckRules(ctxt,
cur->content,
flags,
cur->type);
6420 if (ptype == XML_RELAXNG_GROUP) {
6421 val = xmlRelaxNGGroupContentType(
val,
ret);
6422 }
else if (ptype == XML_RELAXNG_INTERLEAVE) {
6427 tmp = xmlRelaxNGGroupContentType(
val,
ret);
6428 if (tmp != XML_RELAXNG_CONTENT_ERROR)
6429 tmp = xmlRelaxNGMaxContentType(
val,
ret);
6430 }
else if (ptype == XML_RELAXNG_CHOICE) {
6431 val = xmlRelaxNGMaxContentType(
val,
ret);
6432 }
else if (ptype == XML_RELAXNG_LIST) {
6433 val = XML_RELAXNG_CONTENT_SIMPLE;
6434 }
else if (ptype == XML_RELAXNG_EXCEPT) {
6435 if (
ret == XML_RELAXNG_CONTENT_ERROR)
6436 val = XML_RELAXNG_CONTENT_ERROR;
6438 val = XML_RELAXNG_CONTENT_SIMPLE;
6440 val = xmlRelaxNGGroupContentType(
val,
ret);
6457static xmlRelaxNGGrammarPtr
6458xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
6460 xmlRelaxNGGrammarPtr
ret, tmp, old;
6462 ret = xmlRelaxNGNewGrammar(ctxt);
6469 ret->parent = ctxt->grammar;
6470 if (ctxt->grammar !=
NULL) {
6471 tmp = ctxt->grammar->children;
6473 ctxt->grammar->children =
ret;
6475 while (tmp->next !=
NULL)
6481 old = ctxt->grammar;
6482 ctxt->grammar =
ret;
6483 xmlRelaxNGParseGrammarContent(ctxt, nodes);
6484 ctxt->grammar =
ret;
6485 if (ctxt->grammar ==
NULL) {
6487 "Failed to parse <grammar> content\n",
NULL,
NULL);
6488 }
else if (ctxt->grammar->start ==
NULL) {
6490 "Element <grammar> has no <start>\n",
NULL,
NULL);
6496 xmlRelaxNGCombineStart(ctxt,
ret);
6511 ctxt->grammar = old;
6527xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
6531 xmlRelaxNGGrammarPtr old;
6536 schema = xmlRelaxNGNewRelaxNG(ctxt);
6540 olddefine = ctxt->define;
6541 ctxt->define =
NULL;
6542 if (IS_RELAXNG(
node,
"grammar")) {
6543 schema->topgrammar = xmlRelaxNGParseGrammar(ctxt,
node->children);
6549 xmlRelaxNGGrammarPtr tmp,
ret;
6551 schema->topgrammar =
ret = xmlRelaxNGNewGrammar(ctxt);
6559 ret->parent = ctxt->grammar;
6560 if (ctxt->grammar !=
NULL) {
6561 tmp = ctxt->grammar->children;
6563 ctxt->grammar->children =
ret;
6565 while (tmp->next !=
NULL)
6570 old = ctxt->grammar;
6571 ctxt->grammar =
ret;
6572 xmlRelaxNGParseStart(ctxt,
node);
6574 ctxt->grammar = old;
6576 ctxt->define = olddefine;
6578 xmlRelaxNGCheckCycles(ctxt,
schema->topgrammar->start, 0);
6579 if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) {
6580 xmlRelaxNGSimplify(ctxt,
schema->topgrammar->start,
NULL);
6581 while ((
schema->topgrammar->start !=
NULL) &&
6582 (
schema->topgrammar->start->type == XML_RELAXNG_NOOP) &&
6584 schema->topgrammar->start =
6585 schema->topgrammar->start->content;
6586 xmlRelaxNGCheckRules(ctxt,
schema->topgrammar->start,
6587 XML_RELAXNG_IN_START, XML_RELAXNG_NOOP);
6609xmlRelaxNGParserCtxtPtr
6610xmlRelaxNGNewParserCtxt(
const char *URL)
6612 xmlRelaxNGParserCtxtPtr
ret;
6618 (xmlRelaxNGParserCtxtPtr)
xmlMalloc(
sizeof(xmlRelaxNGParserCtxt));
6620 xmlRngPErrMemory(
NULL,
"building parser\n");
6623 memset(
ret, 0,
sizeof(xmlRelaxNGParserCtxt));
6640xmlRelaxNGParserCtxtPtr
6641xmlRelaxNGNewMemParserCtxt(
const char *
buffer,
int size)
6643 xmlRelaxNGParserCtxtPtr
ret;
6649 (xmlRelaxNGParserCtxtPtr)
xmlMalloc(
sizeof(xmlRelaxNGParserCtxt));
6651 xmlRngPErrMemory(
NULL,
"building parser\n");
6654 memset(
ret, 0,
sizeof(xmlRelaxNGParserCtxt));
6672xmlRelaxNGParserCtxtPtr
6673xmlRelaxNGNewDocParserCtxt(xmlDocPtr doc)
6675 xmlRelaxNGParserCtxtPtr
ret;
6680 copy = xmlCopyDoc(doc, 1);
6685 (xmlRelaxNGParserCtxtPtr)
xmlMalloc(
sizeof(xmlRelaxNGParserCtxt));
6687 xmlRngPErrMemory(
NULL,
"building parser\n");
6691 memset(
ret, 0,
sizeof(xmlRelaxNGParserCtxt));
6705xmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt)
6709 if (ctxt->URL !=
NULL)
6711 if (ctxt->doc !=
NULL)
6712 xmlRelaxNGFreeDocument(ctxt->doc);
6713 if (ctxt->interleaves !=
NULL)
6715 if (ctxt->documents !=
NULL)
6716 xmlRelaxNGFreeDocumentList(ctxt->documents);
6717 if (ctxt->includes !=
NULL)
6718 xmlRelaxNGFreeIncludeList(ctxt->includes);
6719 if (ctxt->docTab !=
NULL)
6721 if (ctxt->incTab !=
NULL)
6723 if (ctxt->defTab !=
NULL) {
6726 for (
i = 0;
i < ctxt->defNr;
i++)
6727 xmlRelaxNGFreeDefine(ctxt->defTab[
i]);
6730 if ((ctxt->document !=
NULL) && (ctxt->freedoc))
6731 xmlFreeDoc(ctxt->document);
6795xmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
node)
6812 "Attribute %s is not allowed on %s\n",
6819 "Attribute %s is not allowed on %s\n",
6826 "Attribute %s is not allowed on %s\n",
6833 "Attribute %s is not allowed on %s\n",
6840 val = xmlNodeListGetString(
node->doc,
cur->children, 1);
6846 "Attribute %s contains invalid URI %s\n",
6851 "Attribute %s URI %s is not absolute\n",
6856 "Attribute %s URI %s has a fragment ID\n",
6866 "Unknown attribute %s on %s\n",
cur->name,
6883xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr
root)
6885 xmlNodePtr
cur,
delete;
6890 if (
delete !=
NULL) {
6891 xmlUnlinkNode(
delete);
6892 xmlFreeNode(
delete);
6895 if (
cur->type == XML_ELEMENT_NODE) {
6902 (
cur->parent->type == XML_ELEMENT_NODE) &&
6907 "element %s doesn't allow foreign elements\n",
6913 xmlRelaxNGCleanupAttributes(ctxt,
cur);
6916 xmlRelaxNGDocumentPtr docu;
6923 while ((tmp !=
NULL) &&
6924 (tmp->type == XML_ELEMENT_NODE)) {
6934 "xmlRelaxNGParse: externalRef has no href attribute\n",
6944 "Incorrect URI for externalRef %s\n",
6955 "Fragment forbidden in URI for externalRef %s\n",
6970 "Failed to compute URL for externalRef %s\n",
6985 docu = xmlRelaxNGLoadExternalRef(ctxt, URL,
ns);
6988 "Failed to load externalRef %s\n", URL,
7002 xmlRelaxNGIncludePtr incl;
7008 "xmlRelaxNGParse: include has no href attribute\n",
7017 "Failed to compute URL for include %s\n",
7033 while ((tmp !=
NULL) &&
7034 (tmp->type == XML_ELEMENT_NODE)) {
7041 incl = xmlRelaxNGLoadInclude(ctxt, URL,
cur,
ns);
7046 "Failed to load include %s\n", URL,
7076 xmlAddPrevSibling(
cur->children,
node);
7084 "Failed to create a name %s element\n",
7114 (
node->type == XML_ELEMENT_NODE)) {
7134 name = xmlNodeGetContent(
cur);
7142 xmlRngPErr(ctxt,
cur,
7144 "xmlRelaxNGParse: no namespace for prefix %s\n",
7161 if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7162 xmlRngPErr(ctxt,
cur,
7164 "Found nsName/except//nsName forbidden construct\n",
7170 int oldflags = ctxt->flags;
7178 ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT;
7179 xmlRelaxNGCleanupTree(ctxt,
cur);
7180 ctxt->flags = oldflags;
7182 }
else if ((
cur->parent !=
NULL) &&
7185 ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT;
7186 xmlRelaxNGCleanupTree(ctxt,
cur);
7187 ctxt->flags = oldflags;
7194 if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) {
7195 xmlRngPErr(ctxt,
cur,
7197 "Found anyName/except//anyName forbidden construct\n",
7199 }
else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7200 xmlRngPErr(ctxt,
cur,
7202 "Found nsName/except//anyName forbidden construct\n",
7212 xmlNodePtr
child, ins, tmp;
7229 xmlUnlinkNode(
child);
7230 ins = xmlAddNextSibling(ins,
child);
7243 xmlNsPtr parDef = (xmlNsPtr)&
cur->parent->nsDef;
7245 parDef = parDef->next;
7246 parDef->next =
cur->nsDef;
7257 else if ((
cur->type == XML_TEXT_NODE) ||
7258 (
cur->type == XML_CDATA_SECTION_NODE)) {
7261 (
cur->parent->type == XML_ELEMENT_NODE)) {
7281 if ((
cur->children->type != XML_ENTITY_DECL) &&
7282 (
cur->children->type != XML_ENTITY_REF_NODE) &&
7283 (
cur->children->type != XML_ENTITY_NODE)) {
7308 if (
delete !=
NULL) {
7309 xmlUnlinkNode(
delete);
7310 xmlFreeNode(
delete);
7326xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc)
7333 root = xmlDocGetRootElement(doc);
7335 xmlRngPErr(ctxt, (xmlNodePtr) doc,
XML_RNGP_EMPTY,
"xmlRelaxNGParse: %s is empty\n",
7339 xmlRelaxNGCleanupTree(ctxt,
root);
7354xmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt)
7360 xmlRelaxNGInitTypes();
7368 if (ctxt->URL !=
NULL) {
7372 "xmlRelaxNGParse: could not load %s\n", ctxt->URL,
7376 }
else if (ctxt->buffer !=
NULL) {
7380 "xmlRelaxNGParse: could not parse schemas\n",
NULL,
7386 }
else if (ctxt->document !=
NULL) {
7387 doc = ctxt->document;
7390 "xmlRelaxNGParse: nothing to parse\n",
NULL,
NULL);
7393 ctxt->document = doc;
7398 doc = xmlRelaxNGCleanupDoc(ctxt, doc);
7400 xmlFreeDoc(ctxt->document);
7401 ctxt->document =
NULL;
7408 root = xmlDocGetRootElement(doc);
7410 xmlRngPErr(ctxt, (xmlNodePtr) doc,
7414 xmlFreeDoc(ctxt->document);
7415 ctxt->document =
NULL;
7418 ret = xmlRelaxNGParseDocument(ctxt,
root);
7420 xmlFreeDoc(ctxt->document);
7421 ctxt->document =
NULL;
7431 if (ctxt->interleaves !=
NULL) {
7432 xmlHashScan(ctxt->interleaves, xmlRelaxNGComputeInterleaves, ctxt);
7438 if (ctxt->nbErrors > 0) {
7439 xmlRelaxNGFree(
ret);
7440 ctxt->document =
NULL;
7448 if ((
ret->topgrammar !=
NULL) && (
ret->topgrammar->start !=
NULL)) {
7449 if (
ret->topgrammar->start->type != XML_RELAXNG_START) {
7450 xmlRelaxNGDefinePtr def;
7452 def = xmlRelaxNGNewDefine(ctxt,
NULL);
7454 def->type = XML_RELAXNG_START;
7455 def->content =
ret->topgrammar->start;
7456 ret->topgrammar->start = def;
7459 xmlRelaxNGTryCompile(ctxt,
ret->topgrammar->start);
7466 ctxt->document =
NULL;
7467 ret->documents = ctxt->documents;
7468 ctxt->documents =
NULL;
7470 ret->includes = ctxt->includes;
7471 ctxt->includes =
NULL;
7472 ret->defNr = ctxt->defNr;
7473 ret->defTab = ctxt->defTab;
7474 ctxt->defTab =
NULL;
7475 if (ctxt->idref == 1)
7491xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
7492 xmlRelaxNGValidityErrorFunc
err,
7493 xmlRelaxNGValidityWarningFunc
warn,
void *
ctx)
7498 ctxt->warning =
warn;
7499 ctxt->serror =
NULL;
7500 ctxt->userData =
ctx;
7515xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
7516 xmlRelaxNGValidityErrorFunc *
err,
7517 xmlRelaxNGValidityWarningFunc *
warn,
void **
ctx)
7524 *
warn = ctxt->warning;
7526 *
ctx = ctxt->userData;
7539xmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt,
7545 ctxt->serror = serror;
7547 ctxt->warning =
NULL;
7548 ctxt->userData =
ctx;
7551#ifdef LIBXML_OUTPUT_ENABLED
7558static void xmlRelaxNGDumpDefine(
FILE * output,
7559 xmlRelaxNGDefinePtr
define);
7569xmlRelaxNGDumpDefines(
FILE * output, xmlRelaxNGDefinePtr
defines)
7572 xmlRelaxNGDumpDefine(output,
defines);
7585xmlRelaxNGDumpDefine(
FILE * output, xmlRelaxNGDefinePtr
define)
7590 case XML_RELAXNG_EMPTY:
7591 fprintf(output,
"<empty/>\n");
7593 case XML_RELAXNG_NOT_ALLOWED:
7594 fprintf(output,
"<notAllowed/>\n");
7596 case XML_RELAXNG_TEXT:
7599 case XML_RELAXNG_ELEMENT:
7600 fprintf(output,
"<element>\n");
7607 xmlRelaxNGDumpDefines(output,
define->attrs);
7608 xmlRelaxNGDumpDefines(output,
define->content);
7609 fprintf(output,
"</element>\n");
7611 case XML_RELAXNG_LIST:
7613 xmlRelaxNGDumpDefines(output,
define->content);
7616 case XML_RELAXNG_ONEORMORE:
7617 fprintf(output,
"<oneOrMore>\n");
7618 xmlRelaxNGDumpDefines(output,
define->content);
7619 fprintf(output,
"</oneOrMore>\n");
7621 case XML_RELAXNG_ZEROORMORE:
7622 fprintf(output,
"<zeroOrMore>\n");
7623 xmlRelaxNGDumpDefines(output,
define->content);
7624 fprintf(output,
"</zeroOrMore>\n");
7626 case XML_RELAXNG_CHOICE:
7627 fprintf(output,
"<choice>\n");
7628 xmlRelaxNGDumpDefines(output,
define->content);
7629 fprintf(output,
"</choice>\n");
7631 case XML_RELAXNG_GROUP:
7633 xmlRelaxNGDumpDefines(output,
define->content);
7634 fprintf(output,
"</group>\n");
7636 case XML_RELAXNG_INTERLEAVE:
7637 fprintf(output,
"<interleave>\n");
7638 xmlRelaxNGDumpDefines(output,
define->content);
7639 fprintf(output,
"</interleave>\n");
7641 case XML_RELAXNG_OPTIONAL:
7642 fprintf(output,
"<optional>\n");
7643 xmlRelaxNGDumpDefines(output,
define->content);
7644 fprintf(output,
"</optional>\n");
7646 case XML_RELAXNG_ATTRIBUTE:
7647 fprintf(output,
"<attribute>\n");
7648 xmlRelaxNGDumpDefines(output,
define->content);
7649 fprintf(output,
"</attribute>\n");
7651 case XML_RELAXNG_DEF:
7656 xmlRelaxNGDumpDefines(output,
define->content);
7657 fprintf(output,
"</define>\n");
7659 case XML_RELAXNG_REF:
7664 xmlRelaxNGDumpDefines(output,
define->content);
7667 case XML_RELAXNG_PARENTREF:
7668 fprintf(output,
"<parentRef");
7672 xmlRelaxNGDumpDefines(output,
define->content);
7673 fprintf(output,
"</parentRef>\n");
7675 case XML_RELAXNG_EXTERNALREF:
7676 fprintf(output,
"<externalRef>");
7677 xmlRelaxNGDumpDefines(output,
define->content);
7678 fprintf(output,
"</externalRef>\n");
7680 case XML_RELAXNG_DATATYPE:
7681 case XML_RELAXNG_VALUE:
7683 case XML_RELAXNG_START:
7684 case XML_RELAXNG_EXCEPT:
7685 case XML_RELAXNG_PARAM:
7687 case XML_RELAXNG_NOOP:
7688 xmlRelaxNGDumpDefines(output,
define->content);
7702xmlRelaxNGDumpGrammar(
FILE * output, xmlRelaxNGGrammarPtr grammar,
int top)
7704 if (grammar ==
NULL)
7709 fprintf(output,
" xmlns=\"http://relaxng.org/ns/structure/1.0\"");
7710 switch (grammar->combine) {
7711 case XML_RELAXNG_COMBINE_UNDEFINED:
7713 case XML_RELAXNG_COMBINE_CHOICE:
7714 fprintf(output,
" combine=\"choice\"");
7716 case XML_RELAXNG_COMBINE_INTERLEAVE:
7717 fprintf(output,
" combine=\"interleave\"");
7720 fprintf(output,
" <!-- invalid combine value -->");
7723 if (grammar->start ==
NULL) {
7724 fprintf(output,
" <!-- grammar had no start -->");
7727 xmlRelaxNGDumpDefine(output, grammar->start);
7728 fprintf(output,
"</start>\n");
7731 fprintf(output,
"</grammar>\n");
7742xmlRelaxNGDump(
FILE * output, xmlRelaxNGPtr
schema)
7747 fprintf(output,
"RelaxNG empty or failed to compile\n");
7752 fprintf(output,
"no document\n");
7759 fprintf(output,
"RelaxNG has no top grammar\n");
7762 xmlRelaxNGDumpGrammar(output,
schema->topgrammar, 1);
7773xmlRelaxNGDumpTree(
FILE * output, xmlRelaxNGPtr
schema)
7778 fprintf(output,
"RelaxNG empty or failed to compile\n");
7782 fprintf(output,
"no document\n");
7784 xmlDocDump(output,
schema->doc);
7794static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
7795 xmlRelaxNGDefinePtr
define);
7809 void *transdata,
void *inputdata)
7811 xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
7812 xmlRelaxNGDefinePtr
define = (xmlRelaxNGDefinePtr) transdata;
7820 if (
token[0] ==
'#')
7823 if ((ctxt !=
NULL) && (ctxt->errNo == XML_RELAXNG_OK))
7824 ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7827 if (
define->type != XML_RELAXNG_ELEMENT) {
7829 if (ctxt->errNo == XML_RELAXNG_OK)
7830 ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7833 ret = xmlRelaxNGValidateDefinition(ctxt,
define);
7849xmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt,
7850 xmlRegexpPtr regexp, xmlNodePtr
content)
7852 xmlRegExecCtxtPtr exec;
7857 if ((ctxt ==
NULL) || (regexp ==
NULL))
7859 oldperr = ctxt->perr;
7860 exec = xmlRegNewExecCtxt(regexp,
7861 xmlRelaxNGValidateCompiledCallback, ctxt);
7865 ctxt->state->seq =
cur;
7866 switch (
cur->type) {
7868 case XML_CDATA_SECTION_NODE:
7869 if (xmlIsBlankNode(
cur))
7871 ret = xmlRegExecPushString(exec,
BAD_CAST "#text", ctxt);
7873 VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG,
7877 case XML_ELEMENT_NODE:
7879 ret = xmlRegExecPushString2(exec,
cur->name,
7880 cur->ns->href, ctxt);
7882 ret = xmlRegExecPushString(exec,
cur->name, ctxt);
7885 VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG,
cur->name);
7901 ctxt->state->seq =
NULL;
7902 }
else if (
ret == 0) {
7906 VALID_ERR2(XML_RELAXNG_ERR_NOELEM,
BAD_CAST "");
7908 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
7909 xmlRelaxNGDumpValidError(ctxt);
7913 xmlRegFreeExecCtxt(exec);
7918 if ((
ret == 0) && (ctxt->perr != 0)) {
7921 ctxt->perr = oldperr;
7930static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
7932static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt,
7934static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt);
7946xmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec)
7948 if (ctxt->elemTab ==
NULL) {
7950 ctxt->elemTab = (xmlRegExecCtxtPtr *)
xmlMalloc(ctxt->elemMax *
7952 (xmlRegExecCtxtPtr));
7953 if (ctxt->elemTab ==
NULL) {
7954 xmlRngVErrMemory(ctxt,
"validating\n");
7958 if (ctxt->elemNr >= ctxt->elemMax) {
7960 ctxt->elemTab = (xmlRegExecCtxtPtr *)
xmlRealloc(ctxt->elemTab,
7963 (xmlRegExecCtxtPtr));
7964 if (ctxt->elemTab ==
NULL) {
7965 xmlRngVErrMemory(ctxt,
"validating\n");
7969 ctxt->elemTab[ctxt->elemNr++] = exec;
7982static xmlRegExecCtxtPtr
7983xmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt)
7985 xmlRegExecCtxtPtr
ret;
7987 if (ctxt->elemNr <= 0)
7990 ret = ctxt->elemTab[ctxt->elemNr];
7991 ctxt->elemTab[ctxt->elemNr] =
NULL;
7992 if (ctxt->elemNr > 0)
7993 ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1];
8010xmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec
8013 void *transdata,
void *inputdata)
8015 xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
8016 xmlRelaxNGDefinePtr
define = (xmlRelaxNGDefinePtr) transdata;
8017 xmlRelaxNGValidStatePtr
state, oldstate;
8019 int ret = 0, oldflags;
8028 if (
token[0] ==
'#')
8031 if ((ctxt !=
NULL) && (ctxt->errNo == XML_RELAXNG_OK))
8032 ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8038 if ((ctxt !=
NULL) && (ctxt->errNo == XML_RELAXNG_OK))
8039 ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8042 }
else if (
define->type != XML_RELAXNG_ELEMENT) {
8044 if (ctxt->errNo == XML_RELAXNG_OK)
8045 ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8049 if (
node->type != XML_ELEMENT_NODE) {
8050 VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
8051 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8052 xmlRelaxNGDumpValidError(ctxt);
8064 exec = xmlRegNewExecCtxt(
define->contModel,
8065 xmlRelaxNGValidateProgressiveCallback, ctxt);
8070 xmlRelaxNGElemPush(ctxt, exec);
8075 state = xmlRelaxNGNewValidState(ctxt,
node);
8080 oldstate = ctxt->state;
8081 ctxt->state =
state;
8083 ret = xmlRelaxNGValidateAttributeList(ctxt,
define->attrs);
8086 VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID,
node->name);
8089 if (ctxt->state !=
NULL) {
8090 ctxt->state->seq =
NULL;
8091 ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
8095 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
8096 }
else if (ctxt->states !=
NULL) {
8099 oldflags = ctxt->flags;
8101 for (
i = 0;
i < ctxt->states->nbState;
i++) {
8102 state = ctxt->states->tabState[
i];
8103 ctxt->state =
state;
8104 ctxt->state->seq =
NULL;
8106 if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
8115 ctxt->flags |= FLAGS_IGNORABLE;
8116 xmlRelaxNGLogBestError(ctxt);
8118 for (
i = 0;
i < ctxt->states->nbState;
i++) {
8119 xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[
i]);
8121 xmlRelaxNGFreeStates(ctxt, ctxt->states);
8122 ctxt->states =
NULL;
8123 if ((
ret == 0) && (tmp == -1))
8125 ctxt->flags = oldflags;
8127 if (ctxt->pstate == -1) {
8128 if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
8129 xmlRelaxNGDumpValidError(ctxt);
8132 ctxt->state = oldstate;
8147xmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt,
8156 if (ctxt->elem == 0) {
8158 xmlRelaxNGGrammarPtr grammar;
8159 xmlRegExecCtxtPtr exec;
8160 xmlRelaxNGDefinePtr
define;
8164 VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
8167 grammar =
schema->topgrammar;
8168 if ((grammar ==
NULL) || (grammar->start ==
NULL)) {
8169 VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
8177 exec = xmlRegNewExecCtxt(
define->contModel,
8178 xmlRelaxNGValidateProgressiveCallback,
8183 xmlRelaxNGElemPush(ctxt, exec);
8189 xmlRegExecPushString2(ctxt->elem,
elem->name,
elem->ns->href,
8192 ret = xmlRegExecPushString(ctxt->elem,
elem->name, ctxt);
8195 VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG,
elem->name);
8197 if (ctxt->pstate == 0)
8199 else if (ctxt->pstate < 0)
8218xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt,
8226 while (*
data != 0) {
8234 ret = xmlRegExecPushString(ctxt->elem,
BAD_CAST "#text", ctxt);
8236 VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG,
BAD_CAST " TODO ");
8254xmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt,
8259 xmlRegExecCtxtPtr exec;
8266 exec = xmlRelaxNGElemPop(ctxt);
8272 VALID_ERR2(XML_RELAXNG_ERR_NOELEM,
BAD_CAST "");
8274 }
else if (
ret < 0) {
8279 xmlRegFreeExecCtxt(exec);
8295xmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt,
8300 xmlRelaxNGValidStatePtr
state;
8304 state = xmlRelaxNGNewValidState(ctxt,
elem->parent);
8309 ctxt->state =
state;
8310 ctxt->errNo = XML_RELAXNG_OK;
8311 ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef);
8312 if ((
ret != 0) || (ctxt->errNo != XML_RELAXNG_OK))
8316 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
8326static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8327 xmlRelaxNGDefinePtr
define);
8346 ((
node->type == XML_COMMENT_NODE) ||
8347 (
node->type == XML_PI_NODE) ||
8348 (
node->type == XML_XINCLUDE_START) ||
8349 (
node->type == XML_XINCLUDE_END) ||
8350 (((
node->type == XML_TEXT_NODE) ||
8351 (
node->type == XML_CDATA_SECTION_NODE)) &&
8352 ((ctxt->flags & FLAGS_MIXED_CONTENT) ||
8370xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
const xmlChar *
str)
8385 xmlRngVErrMemory(ctxt,
"validating\n");
8417xmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt,
8422 xmlRelaxNGTypeLibraryPtr lib;
8424 xmlRelaxNGDefinePtr
cur;
8429 lib = (xmlRelaxNGTypeLibraryPtr)
define->data;
8430 if (lib->check !=
NULL) {
8432 (
define->attrs->type == XML_RELAXNG_PARAM)) {
8441 VALID_ERR2(XML_RELAXNG_ERR_TYPE,
define->
name);
8443 lib->freef(lib->data,
result);
8445 }
else if (
ret == 1) {
8447 }
else if (
ret == 2) {
8448 VALID_ERR2P(XML_RELAXNG_ERR_DUPID,
value);
8454 while ((
ret == 0) && (
cur !=
NULL) && (
cur->type == XML_RELAXNG_PARAM)) {
8455 if (lib->facet !=
NULL) {
8464 const xmlChar *oldvalue, *oldendvalue;
8466 oldvalue = ctxt->state->value;
8467 oldendvalue = ctxt->state->endvalue;
8469 ctxt->state->endvalue =
NULL;
8470 ret = xmlRelaxNGValidateValue(ctxt,
define->content);
8471 ctxt->state->value = (
xmlChar *) oldvalue;
8472 ctxt->state->endvalue = (
xmlChar *) oldendvalue;
8475 lib->freef(lib->data,
result);
8488xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt)
8492 cur = ctxt->state->value;
8493 if ((
cur ==
NULL) || (ctxt->state->endvalue ==
NULL)) {
8494 ctxt->state->value =
NULL;
8495 ctxt->state->endvalue =
NULL;
8500 while ((
cur != ctxt->state->endvalue) && (*
cur == 0))
8502 if (
cur == ctxt->state->endvalue)
8503 ctxt->state->value =
NULL;
8519xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt,
8525 ret = xmlRelaxNGValidateValue(ctxt,
defines);
8543xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8544 xmlRelaxNGDefinePtr
define)
8546 int ret = 0, oldflags;
8549 value = ctxt->state->value;
8551 case XML_RELAXNG_EMPTY:{
8562 case XML_RELAXNG_TEXT:
8564 case XML_RELAXNG_VALUE:{
8567 xmlRelaxNGTypeLibraryPtr lib;
8569 lib = (xmlRelaxNGTypeLibraryPtr)
define->data;
8574 value, ctxt->state->node);
8578 VALID_ERR2(XML_RELAXNG_ERR_TYPECMP,
8581 }
else if (
ret == 1) {
8594 nvalue = xmlRelaxNGNormalize(ctxt,
value);
8596 if ((nval ==
NULL) || (nvalue ==
NULL) ||
8606 xmlRelaxNGNextValue(ctxt);
8609 case XML_RELAXNG_DATATYPE:{
8613 xmlRelaxNGNextValue(ctxt);
8617 case XML_RELAXNG_CHOICE:{
8621 oldflags = ctxt->flags;
8622 ctxt->flags |= FLAGS_IGNORABLE;
8624 oldvalue = ctxt->state->
value;
8626 ret = xmlRelaxNGValidateValue(ctxt,
list);
8630 ctxt->state->value = oldvalue;
8633 ctxt->flags = oldflags;
8635 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8636 xmlRelaxNGDumpValidError(ctxt);
8638 if (ctxt->errNr > 0)
8639 xmlRelaxNGPopErrors(ctxt, 0);
8643 case XML_RELAXNG_LIST:{
8647 oldvalue = ctxt->state->value;
8648 oldend = ctxt->state->endvalue;
8655 VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
8668 ctxt->state->endvalue =
cur;
8670 while ((*
cur == 0) && (
cur != ctxt->state->endvalue))
8673 ctxt->state->value =
cur;
8676 if (ctxt->state->value == ctxt->state->endvalue)
8677 ctxt->state->value =
NULL;
8678 ret = xmlRelaxNGValidateValue(ctxt,
list);
8685 if ((
ret == 0) && (ctxt->state->value !=
NULL) &&
8686 (ctxt->state->value != ctxt->state->endvalue)) {
8687 VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA,
8688 ctxt->state->value);
8692 ctxt->state->value = oldvalue;
8693 ctxt->state->endvalue = oldend;
8696 case XML_RELAXNG_ONEORMORE:
8697 ret = xmlRelaxNGValidateValueList(ctxt,
define->content);
8702 case XML_RELAXNG_ZEROORMORE:{
8705 if ((ctxt->state->value ==
NULL) ||
8706 (*ctxt->state->value == 0)) {
8710 oldflags = ctxt->flags;
8711 ctxt->flags |= FLAGS_IGNORABLE;
8712 cur = ctxt->state->value;
8714 while ((
cur !=
NULL) && (
cur != ctxt->state->endvalue) &&
8718 xmlRelaxNGValidateValueList(ctxt,
define->content);
8720 ctxt->state->value =
temp;
8724 cur = ctxt->state->value;
8726 ctxt->flags = oldflags;
8727 if (ctxt->errNr > 0)
8728 xmlRelaxNGPopErrors(ctxt, 0);
8731 case XML_RELAXNG_OPTIONAL:{
8734 if ((ctxt->state->value ==
NULL) ||
8735 (*ctxt->state->value == 0)) {
8739 oldflags = ctxt->flags;
8740 ctxt->flags |= FLAGS_IGNORABLE;
8741 temp = ctxt->state->value;
8742 ret = xmlRelaxNGValidateValue(ctxt,
define->content);
8743 ctxt->flags = oldflags;
8745 ctxt->state->value =
temp;
8746 if (ctxt->errNr > 0)
8747 xmlRelaxNGPopErrors(ctxt, 0);
8751 if (ctxt->errNr > 0)
8752 xmlRelaxNGPopErrors(ctxt, 0);
8755 case XML_RELAXNG_EXCEPT:{
8756 xmlRelaxNGDefinePtr
list;
8760 ret = xmlRelaxNGValidateValue(ctxt,
list);
8770 case XML_RELAXNG_DEF:
8771 case XML_RELAXNG_GROUP:{
8772 xmlRelaxNGDefinePtr
list;
8776 ret = xmlRelaxNGValidateValue(ctxt,
list);
8786 case XML_RELAXNG_REF:
8787 case XML_RELAXNG_PARENTREF:
8789 VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
8792 ret = xmlRelaxNGValidateValue(ctxt,
define->content);
8811xmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt,
8817 ret = xmlRelaxNGValidateValue(ctxt,
defines);
8836xmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt,
8837 xmlRelaxNGDefinePtr
define, xmlAttrPtr prop)
8846 if (
define->ns[0] == 0) {
8847 if (prop->ns !=
NULL)
8850 if ((prop->ns ==
NULL) ||
8858 if (
define->type == XML_RELAXNG_EXCEPT) {
8859 xmlRelaxNGDefinePtr
list;
8863 ret = xmlRelaxNGAttributeMatch(ctxt,
list, prop);
8870 }
else if (
define->type == XML_RELAXNG_CHOICE) {
8871 xmlRelaxNGDefinePtr
list;
8875 ret = xmlRelaxNGAttributeMatch(ctxt,
list, prop);
8898xmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt,
8899 xmlRelaxNGDefinePtr
define)
8903 xmlAttrPtr prop =
NULL, tmp;
8906 if (ctxt->state->nbAttrLeft <= 0)
8909 for (
i = 0;
i < ctxt->state->nbAttrs;
i++) {
8910 tmp = ctxt->state->attrs[
i];
8913 (tmp->ns ==
NULL)) ||
8914 ((tmp->ns !=
NULL) &&
8922 value = xmlNodeListGetString(prop->doc, prop->children, 1);
8923 oldvalue = ctxt->state->value;
8924 oldseq = ctxt->state->seq;
8925 ctxt->state->seq = (xmlNodePtr) prop;
8926 ctxt->state->value =
value;
8927 ctxt->state->endvalue =
NULL;
8928 ret = xmlRelaxNGValidateValueContent(ctxt,
define->content);
8929 if (ctxt->state->value !=
NULL)
8930 value = ctxt->state->value;
8933 ctxt->state->value = oldvalue;
8934 ctxt->state->seq = oldseq;
8939 ctxt->state->attrs[
i] =
NULL;
8940 ctxt->state->nbAttrLeft--;
8946 for (
i = 0;
i < ctxt->state->nbAttrs;
i++) {
8947 tmp = ctxt->state->attrs[
i];
8948 if ((tmp !=
NULL) &&
8949 (xmlRelaxNGAttributeMatch(ctxt,
define, tmp) == 1)) {
8955 value = xmlNodeListGetString(prop->doc, prop->children, 1);
8956 oldvalue = ctxt->state->value;
8957 oldseq = ctxt->state->seq;
8958 ctxt->state->seq = (xmlNodePtr) prop;
8959 ctxt->state->value =
value;
8960 ret = xmlRelaxNGValidateValueContent(ctxt,
define->content);
8961 if (ctxt->state->value !=
NULL)
8962 value = ctxt->state->value;
8965 ctxt->state->value = oldvalue;
8966 ctxt->state->seq = oldseq;
8971 ctxt->state->attrs[
i] =
NULL;
8972 ctxt->state->nbAttrLeft--;
8992xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
8997 xmlRelaxNGDefinePtr
cur;
9001 if (
cur->type == XML_RELAXNG_ATTRIBUTE) {
9002 if (xmlRelaxNGValidateAttribute(ctxt,
cur) != 0)
9012 if (
cur->type != XML_RELAXNG_ATTRIBUTE) {
9013 if ((ctxt->state !=
NULL) || (ctxt->states !=
NULL)) {
9014 res = xmlRelaxNGValidateDefinition(ctxt,
cur);
9018 VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
9040xmlRelaxNGNodeMatchesList(xmlNodePtr
node, xmlRelaxNGDefinePtr *
list)
9042 xmlRelaxNGDefinePtr
cur;
9050 if ((
node->type == XML_ELEMENT_NODE) &&
9051 (
cur->type == XML_RELAXNG_ELEMENT)) {
9055 }
else if (((
node->type == XML_TEXT_NODE) ||
9056 (
node->type == XML_CDATA_SECTION_NODE)) &&
9057 ((
cur->type == XML_RELAXNG_DATATYPE) ||
9058 (
cur->type == XML_RELAXNG_LIST) ||
9059 (
cur->type == XML_RELAXNG_TEXT) ||
9060 (
cur->type == XML_RELAXNG_VALUE))) {
9078xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
9079 xmlRelaxNGDefinePtr
define)
9081 int ret = 0,
i, nbgroups;
9082 int errNr = ctxt->errNr;
9085 xmlRelaxNGValidStatePtr oldstate;
9086 xmlRelaxNGPartitionPtr partitions;
9087 xmlRelaxNGInterleaveGroupPtr
group =
NULL;
9092 partitions = (xmlRelaxNGPartitionPtr)
define->data;
9093 nbgroups = partitions->nbgroups;
9095 VALID_ERR(XML_RELAXNG_ERR_INTERNODATA);
9101 oldflags = ctxt->flags;
9102 if (
define->dflags & IS_MIXED) {
9103 ctxt->flags |= FLAGS_MIXED_CONTENT;
9104 if (nbgroups == 2) {
9108 if (ctxt->state !=
NULL)
9109 ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
9111 if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT)
9112 ret = xmlRelaxNGValidateDefinition(ctxt,
9113 partitions->groups[1]->
9116 ret = xmlRelaxNGValidateDefinition(ctxt,
9117 partitions->groups[0]->
9120 if (ctxt->state !=
NULL)
9121 ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
9125 ctxt->flags = oldflags;
9134 list = (xmlNodePtr *)
xmlMalloc(nbgroups *
sizeof(xmlNodePtr));
9136 xmlRngVErrMemory(ctxt,
"validating\n");
9139 memset(
list, 0, nbgroups *
sizeof(xmlNodePtr));
9140 lasts = (xmlNodePtr *)
xmlMalloc(nbgroups *
sizeof(xmlNodePtr));
9141 if (lasts ==
NULL) {
9142 xmlRngVErrMemory(ctxt,
"validating\n");
9145 memset(lasts, 0, nbgroups *
sizeof(xmlNodePtr));
9151 cur = ctxt->state->seq;
9152 cur = xmlRelaxNGSkipIgnored(ctxt,
cur);
9155 ctxt->state->seq =
cur;
9156 if ((partitions->triage !=
NULL) &&
9157 (partitions->flags & IS_DETERMINIST)) {
9160 if ((
cur->type == XML_TEXT_NODE) ||
9161 (
cur->type == XML_CDATA_SECTION_NODE)) {
9164 }
else if (
cur->type == XML_ELEMENT_NODE) {
9186 if (partitions->flags & IS_NEEDCHECK) {
9187 group = partitions->groups[
i];
9188 if (!xmlRelaxNGNodeMatchesList(
cur,
group->defs))
9193 for (
i = 0;
i < nbgroups;
i++) {
9194 group = partitions->groups[
i];
9197 if (xmlRelaxNGNodeMatchesList(
cur,
group->defs))
9204 if (
i >= nbgroups) {
9207 if (lasts[
i] !=
NULL) {
9208 lasts[
i]->next =
cur;
9215 lastchg =
cur->next;
9218 cur = xmlRelaxNGSkipIgnored(ctxt,
cur->next);
9221 VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9226 oldstate = ctxt->state;
9227 for (
i = 0;
i < nbgroups;
i++) {
9228 ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate);
9229 if (ctxt->state ==
NULL) {
9233 group = partitions->groups[
i];
9234 if (lasts[
i] !=
NULL) {
9235 last = lasts[
i]->next;
9236 lasts[
i]->next =
NULL;
9238 ctxt->state->seq =
list[
i];
9239 ret = xmlRelaxNGValidateDefinition(ctxt,
group->rule);
9242 if (ctxt->state !=
NULL) {
9243 cur = ctxt->state->seq;
9244 cur = xmlRelaxNGSkipIgnored(ctxt,
cur);
9245 xmlRelaxNGFreeValidState(ctxt, oldstate);
9246 oldstate = ctxt->state;
9256 && (
define->parent->type != XML_RELAXNG_DEF
9258 (
const xmlChar *)
"open-name-class"))) {
9259 VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA,
cur->name);
9261 ctxt->state = oldstate;
9264 }
else if (ctxt->states !=
NULL) {
9274 for (
j = 0;
j < ctxt->states->nbState;
j++) {
9275 cur = ctxt->states->tabState[
j]->seq;
9276 cur = xmlRelaxNGSkipIgnored(ctxt,
cur);
9279 lowattr = ctxt->states->tabState[
j]->nbAttrLeft;
9283 if (ctxt->states->tabState[
j]->nbAttrLeft <= lowattr) {
9285 lowattr = ctxt->states->tabState[
j]->nbAttrLeft;
9290 }
else if (found == 0) {
9291 if (lowattr == -1) {
9292 lowattr = ctxt->states->tabState[
j]->nbAttrLeft;
9295 if (ctxt->states->tabState[
j]->nbAttrLeft <= lowattr) {
9297 lowattr = ctxt->states->tabState[
j]->nbAttrLeft;
9305 if (ctxt->states->nbState > 0) {
9306 xmlRelaxNGFreeValidState(ctxt, oldstate);
9308 oldstate = ctxt->states->tabState[best];
9309 ctxt->states->tabState[best] =
NULL;
9312 ctxt->states->tabState[ctxt->states->nbState - 1];
9313 ctxt->states->tabState[ctxt->states->nbState - 1] =
NULL;
9314 ctxt->states->nbState--;
9317 for (
j = 0;
j < ctxt->states->nbState ;
j++) {
9318 xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[
j]);
9320 xmlRelaxNGFreeStates(ctxt, ctxt->states);
9321 ctxt->states =
NULL;
9324 VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA,
9327 VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA,
cur->name);
9330 ctxt->state = oldstate;
9337 if (lasts[
i] !=
NULL) {
9338 lasts[
i]->next =
last;
9341 if (ctxt->state !=
NULL)
9342 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
9343 ctxt->state = oldstate;
9344 ctxt->state->seq = lastelem;
9346 VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9352 ctxt->flags = oldflags;
9364 if (ctxt->errNr > errNr)
9365 xmlRelaxNGPopErrors(ctxt, errNr);
9383xmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt,
9390 VALID_ERR2(XML_RELAXNG_ERR_INTERNAL,
9395 if ((ctxt->state !=
NULL) || (ctxt->states !=
NULL)) {
9396 res = xmlRelaxNGValidateDefinition(ctxt,
defines);
9400 VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
9422xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
9425 int ret = 0, oldflags = 0;
9435 VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS,
elem->name);
9438 VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS,
9444 VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS,
elem->name);
9447 VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS,
define->
name);
9455 if (
define->type == XML_RELAXNG_EXCEPT) {
9456 xmlRelaxNGDefinePtr
list;
9459 oldflags = ctxt->flags;
9460 ctxt->flags |= FLAGS_IGNORABLE;
9468 ctxt->flags = oldflags;
9473 ctxt->flags = oldflags;
9480 ctxt->flags = oldflags;
9482 }
else if (
define->type == XML_RELAXNG_CHOICE) {
9483 xmlRelaxNGDefinePtr
list;
9486 oldflags = ctxt->flags;
9487 ctxt->flags |= FLAGS_IGNORABLE;
9495 ctxt->flags = oldflags;
9500 ctxt->flags = oldflags;
9507 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9508 xmlRelaxNGDumpValidError(ctxt);
9510 if (ctxt->errNr > 0)
9511 xmlRelaxNGPopErrors(ctxt, 0);
9516 ctxt->flags = oldflags;
9536xmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt)
9538 xmlRelaxNGValidStatePtr
state;
9541 int value = 1000000;
9543 if ((ctxt ==
NULL) || (ctxt->states ==
NULL) ||
9544 (ctxt->states->nbState <= 0))
9547 for (
i = 0;
i < ctxt->states->nbState;
i++) {
9548 state = ctxt->states->tabState[
i];
9552 if ((best == -1) || (
value > 100000)) {
9557 tmp =
state->nbAttrLeft;
9558 if ((best == -1) || (
value > tmp)) {
9575xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt)
9579 if ((ctxt ==
NULL) || (ctxt->states ==
NULL) ||
9580 (ctxt->states->nbState <= 0))
9583 best = xmlRelaxNGBestState(ctxt);
9584 if ((best >= 0) && (best < ctxt->states->nbState)) {
9585 ctxt->state = ctxt->states->tabState[best];
9587 xmlRelaxNGValidateElementEnd(ctxt, 1);
9603xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt,
int dolog)
9606 xmlRelaxNGValidStatePtr
state;
9608 state = ctxt->state;
9610 state->seq = xmlRelaxNGSkipIgnored(ctxt,
state->seq);
9613 VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT,
9619 for (
i = 0;
i <
state->nbAttrs;
i++) {
9622 VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR,
9641xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
9642 xmlRelaxNGDefinePtr
define)
9645 int ret = 0,
i, tmp, oldflags, errNr;
9646 xmlRelaxNGValidStatePtr oldstate =
NULL,
state;
9649 VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
9653 if (ctxt->state !=
NULL) {
9654 node = ctxt->state->seq;
9660 case XML_RELAXNG_EMPTY:
9663 case XML_RELAXNG_NOT_ALLOWED:
9666 case XML_RELAXNG_TEXT:
9668 ((
node->type == XML_TEXT_NODE) ||
9669 (
node->type == XML_COMMENT_NODE) ||
9670 (
node->type == XML_PI_NODE) ||
9671 (
node->type == XML_CDATA_SECTION_NODE)))
9673 ctxt->state->seq =
node;
9675 case XML_RELAXNG_ELEMENT:
9676 errNr = ctxt->errNr;
9677 node = xmlRelaxNGSkipIgnored(ctxt,
node);
9679 VALID_ERR2(XML_RELAXNG_ERR_NOELEM,
define->
name);
9681 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9682 xmlRelaxNGDumpValidError(ctxt);
9685 if (
node->type != XML_ELEMENT_NODE) {
9686 VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
9688 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9689 xmlRelaxNGDumpValidError(ctxt);
9697 ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
node->
next);
9698 if (ctxt->errNr > errNr)
9699 xmlRelaxNGPopErrors(ctxt, errNr);
9700 if (ctxt->errNr != 0) {
9701 while ((ctxt->err !=
NULL) &&
9702 (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME)
9706 XML_RELAXNG_ERR_ELEMEXTRANS)
9708 || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM)
9709 || (ctxt->err->err ==
9710 XML_RELAXNG_ERR_NOTELEM)))
9711 xmlRelaxNGValidErrorPop(ctxt);
9719 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9720 xmlRelaxNGDumpValidError(ctxt);
9724 if (ctxt->errNr != 0) {
9725 if (ctxt->errNr > errNr)
9726 xmlRelaxNGPopErrors(ctxt, errNr);
9727 while ((ctxt->err !=
NULL) &&
9728 (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) &&
9730 ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) &&
9732 (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) ||
9733 (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM)))
9734 xmlRelaxNGValidErrorPop(ctxt);
9736 errNr = ctxt->errNr;
9738 oldflags = ctxt->flags;
9739 if (ctxt->flags & FLAGS_MIXED_CONTENT) {
9740 ctxt->flags -= FLAGS_MIXED_CONTENT;
9742 state = xmlRelaxNGNewValidState(ctxt,
node);
9745 if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9746 xmlRelaxNGDumpValidError(ctxt);
9750 oldstate = ctxt->state;
9751 ctxt->state =
state;
9753 tmp = xmlRelaxNGValidateAttributeList(ctxt,
define->attrs);
9756 VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID,
node->name);
9760 xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state;
9761 xmlRelaxNGStatesPtr tmpstates = ctxt->states;
9764 nstate = xmlRelaxNGNewValidState(ctxt,
node);
9765 ctxt->state = nstate;
9766 ctxt->states =
NULL;
9768 tmp = xmlRelaxNGValidateCompiledContent(ctxt,
9771 nseq = ctxt->state->seq;
9772 ctxt->state = tmpstate;
9773 ctxt->states = tmpstates;
9774 xmlRelaxNGFreeValidState(ctxt, nstate);
9779 if (ctxt->states !=
NULL) {
9782 for (
i = 0;
i < ctxt->states->nbState;
i++) {
9783 state = ctxt->states->tabState[
i];
9784 ctxt->state =
state;
9785 ctxt->state->seq = nseq;
9787 if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
9796 ctxt->flags |= FLAGS_IGNORABLE;
9797 xmlRelaxNGLogBestError(ctxt);
9799 for (
i = 0;
i < ctxt->states->nbState;
i++) {
9800 xmlRelaxNGFreeValidState(ctxt,
9804 xmlRelaxNGFreeStates(ctxt, ctxt->states);
9805 ctxt->flags = oldflags;
9806 ctxt->states =
NULL;
9807 if ((
ret == 0) && (tmp == -1))
9810 state = ctxt->state;
9811 if (ctxt->state !=
NULL)
9812 ctxt->state->seq = nseq;
9814 ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
9815 xmlRelaxNGFreeValidState(ctxt,
state);
9819 tmp = xmlRelaxNGValidateDefinitionList(ctxt,
9824 if (ctxt->state ==
NULL) {
9825 ctxt->state = oldstate;
9826 VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID,
9830 VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID,
9836 if (ctxt->states !=
NULL) {
9839 for (
i = 0;
i < ctxt->states->nbState;
i++) {
9840 state = ctxt->states->tabState[
i];
9841 ctxt->state =
state;
9843 if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
9852 ctxt->flags |= FLAGS_IGNORABLE;
9853 xmlRelaxNGLogBestError(ctxt);
9855 for (
i = 0;
i < ctxt->states->nbState;
i++) {
9856 xmlRelaxNGFreeValidState(ctxt,
9857 ctxt->states->tabState[
i]);
9858 ctxt->states->tabState[
i] =
NULL;
9860 xmlRelaxNGFreeStates(ctxt, ctxt->states);
9861 ctxt->flags = oldflags;
9862 ctxt->states =
NULL;
9863 if ((
ret == 0) && (tmp == -1))
9866 state = ctxt->state;
9868 ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
9869 xmlRelaxNGFreeValidState(ctxt,
state);
9875 ctxt->flags = oldflags;
9876 ctxt->state = oldstate;
9877 if (oldstate !=
NULL)
9878 oldstate->seq = xmlRelaxNGSkipIgnored(ctxt,
node->
next);
9880 if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
9881 xmlRelaxNGDumpValidError(ctxt);
9889 if (ctxt->errNr > errNr)
9890 xmlRelaxNGPopErrors(ctxt, errNr);
9894 case XML_RELAXNG_OPTIONAL:{
9895 errNr = ctxt->errNr;
9896 oldflags = ctxt->flags;
9897 ctxt->flags |= FLAGS_IGNORABLE;
9898 oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
9900 xmlRelaxNGValidateDefinitionList(ctxt,
9903 if (ctxt->state !=
NULL)
9904 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
9905 ctxt->state = oldstate;
9906 ctxt->flags = oldflags;
9908 if (ctxt->errNr > errNr)
9909 xmlRelaxNGPopErrors(ctxt, errNr);
9912 if (ctxt->states !=
NULL) {
9913 xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate);
9915 ctxt->states = xmlRelaxNGNewStates(ctxt, 1);
9916 if (ctxt->states ==
NULL) {
9917 xmlRelaxNGFreeValidState(ctxt, oldstate);
9918 ctxt->flags = oldflags;
9920 if (ctxt->errNr > errNr)
9921 xmlRelaxNGPopErrors(ctxt, errNr);
9924 xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate);
9925 xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state);
9928 ctxt->flags = oldflags;
9930 if (ctxt->errNr > errNr)
9931 xmlRelaxNGPopErrors(ctxt, errNr);
9934 case XML_RELAXNG_ONEORMORE:
9935 errNr = ctxt->errNr;
9936 ret = xmlRelaxNGValidateDefinitionList(ctxt,
define->content);
9940 if (ctxt->errNr > errNr)
9941 xmlRelaxNGPopErrors(ctxt, errNr);
9943 case XML_RELAXNG_ZEROORMORE:{
9948 errNr = ctxt->errNr;
9949 res = xmlRelaxNGNewStates(ctxt, 1);
9957 if (ctxt->state !=
NULL) {
9958 xmlRelaxNGAddStates(ctxt,
res,
9959 xmlRelaxNGCopyValidState(ctxt,
9963 for (
j = 0;
j < ctxt->states->nbState;
j++) {
9964 xmlRelaxNGAddStates(ctxt,
res,
9965 xmlRelaxNGCopyValidState(ctxt,
9966 ctxt->states->tabState[
j]));
9969 oldflags = ctxt->flags;
9970 ctxt->flags |= FLAGS_IGNORABLE;
9975 if (ctxt->states !=
NULL) {
9976 states = ctxt->states;
9977 for (
i = 0;
i < states->nbState;
i++) {
9978 ctxt->state = states->tabState[
i];
9979 ctxt->states =
NULL;
9980 ret = xmlRelaxNGValidateDefinitionList(ctxt,
9984 if (ctxt->state !=
NULL) {
9985 tmp = xmlRelaxNGAddStates(ctxt,
res,
9990 }
else if (ctxt->states !=
NULL) {
9991 for (
j = 0;
j < ctxt->states->nbState;
9994 xmlRelaxNGAddStates(ctxt,
res,
9995 ctxt->states->tabState[
j]);
9999 xmlRelaxNGFreeStates(ctxt,
10001 ctxt->states =
NULL;
10004 if (ctxt->state !=
NULL) {
10005 xmlRelaxNGFreeValidState(ctxt,
10007 ctxt->state =
NULL;
10012 ret = xmlRelaxNGValidateDefinitionList(ctxt,
10016 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10017 ctxt->state =
NULL;
10020 if (ctxt->state !=
NULL) {
10021 tmp = xmlRelaxNGAddStates(ctxt,
res,
10023 ctxt->state =
NULL;
10026 }
else if (ctxt->states !=
NULL) {
10027 for (
j = 0;
j < ctxt->states->nbState;
j++) {
10028 tmp = xmlRelaxNGAddStates(ctxt,
res,
10029 ctxt->states->tabState[
j]);
10033 if (states ==
NULL) {
10034 states = ctxt->states;
10036 xmlRelaxNGFreeStates(ctxt,
10039 ctxt->states =
NULL;
10048 if (
res->nbState -
base == 1) {
10049 ctxt->state = xmlRelaxNGCopyValidState(ctxt,
10054 if (states ==
NULL) {
10055 xmlRelaxNGNewStates(ctxt,
10057 states = ctxt->states;
10058 if (states ==
NULL) {
10063 states->nbState = 0;
10065 xmlRelaxNGAddStates(ctxt, states,
10066 xmlRelaxNGCopyValidState
10067 (ctxt,
res->tabState[
i]));
10068 ctxt->states = states;
10072 if (states !=
NULL) {
10073 xmlRelaxNGFreeStates(ctxt, states);
10075 ctxt->states =
res;
10076 ctxt->flags = oldflags;
10081 if (ctxt->errNr > errNr)
10082 xmlRelaxNGPopErrors(ctxt, errNr);
10087 case XML_RELAXNG_CHOICE:{
10089 xmlRelaxNGStatesPtr states =
NULL;
10091 node = xmlRelaxNGSkipIgnored(ctxt,
node);
10093 errNr = ctxt->errNr;
10108 if ((
node->type == XML_TEXT_NODE) ||
10109 (
node->type == XML_CDATA_SECTION_NODE)) {
10112 }
else if (
node->type == XML_ELEMENT_NODE) {
10130 VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG,
node->name);
10133 ret = xmlRelaxNGValidateDefinition(ctxt,
list);
10140 oldflags = ctxt->flags;
10141 ctxt->flags |= FLAGS_IGNORABLE;
10144 oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
10145 ret = xmlRelaxNGValidateDefinition(ctxt,
list);
10147 if (states ==
NULL) {
10148 states = xmlRelaxNGNewStates(ctxt, 1);
10150 if (ctxt->state !=
NULL) {
10151 xmlRelaxNGAddStates(ctxt, states, ctxt->state);
10152 }
else if (ctxt->states !=
NULL) {
10153 for (
i = 0;
i < ctxt->states->nbState;
i++) {
10154 xmlRelaxNGAddStates(ctxt, states,
10158 xmlRelaxNGFreeStates(ctxt, ctxt->states);
10159 ctxt->states =
NULL;
10162 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10164 ctxt->state = oldstate;
10167 if (states !=
NULL) {
10168 xmlRelaxNGFreeValidState(ctxt, oldstate);
10169 ctxt->states = states;
10170 ctxt->state =
NULL;
10173 ctxt->states =
NULL;
10175 ctxt->flags = oldflags;
10177 if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
10178 xmlRelaxNGDumpValidError(ctxt);
10181 if (ctxt->errNr > errNr)
10182 xmlRelaxNGPopErrors(ctxt, errNr);
10186 case XML_RELAXNG_DEF:
10187 case XML_RELAXNG_GROUP:
10188 ret = xmlRelaxNGValidateDefinitionList(ctxt,
define->content);
10190 case XML_RELAXNG_INTERLEAVE:
10191 ret = xmlRelaxNGValidateInterleave(ctxt,
define);
10193 case XML_RELAXNG_ATTRIBUTE:
10194 ret = xmlRelaxNGValidateAttribute(ctxt,
define);
10196 case XML_RELAXNG_START:
10197 case XML_RELAXNG_NOOP:
10198 case XML_RELAXNG_REF:
10199 case XML_RELAXNG_EXTERNALREF:
10200 case XML_RELAXNG_PARENTREF:
10201 ret = xmlRelaxNGValidateDefinition(ctxt,
define->content);
10203 case XML_RELAXNG_DATATYPE:{
10209 if (
child->type == XML_ELEMENT_NODE) {
10210 VALID_ERR2(XML_RELAXNG_ERR_DATAELEM,
10211 node->parent->name);
10214 }
else if ((
child->type == XML_TEXT_NODE) ||
10215 (
child->type == XML_CDATA_SECTION_NODE)) {
10229 xmlRngVErrMemory(ctxt,
"validating\n");
10237 VALID_ERR2(XML_RELAXNG_ERR_DATATYPE,
define->
name);
10238 }
else if (
ret == 0) {
10239 ctxt->state->seq =
NULL;
10245 case XML_RELAXNG_VALUE:{
10252 if (
child->type == XML_ELEMENT_NODE) {
10253 VALID_ERR2(XML_RELAXNG_ERR_VALELEM,
10254 node->parent->name);
10257 }
else if ((
child->type == XML_TEXT_NODE) ||
10258 (
child->type == XML_CDATA_SECTION_NODE)) {
10272 xmlRngVErrMemory(ctxt,
"validating\n");
10277 oldvalue = ctxt->state->value;
10278 ctxt->state->value =
content;
10279 ret = xmlRelaxNGValidateValue(ctxt,
define);
10280 ctxt->state->value = oldvalue;
10282 VALID_ERR2(XML_RELAXNG_ERR_VALUE,
define->
name);
10283 }
else if (
ret == 0) {
10284 ctxt->state->seq =
NULL;
10290 case XML_RELAXNG_LIST:{
10293 xmlChar *oldvalue, *oldendvalue;
10303 if (
child->type == XML_ELEMENT_NODE) {
10304 VALID_ERR2(XML_RELAXNG_ERR_LISTELEM,
10305 node->parent->name);
10308 }
else if ((
child->type == XML_TEXT_NODE) ||
10309 (
child->type == XML_CDATA_SECTION_NODE)) {
10323 xmlRngVErrMemory(ctxt,
"validating\n");
10329 oldvalue = ctxt->state->value;
10330 oldendvalue = ctxt->state->endvalue;
10331 ctxt->state->value =
content;
10333 ret = xmlRelaxNGValidateValue(ctxt,
define);
10334 ctxt->state->value = oldvalue;
10335 ctxt->state->endvalue = oldendvalue;
10337 VALID_ERR(XML_RELAXNG_ERR_LIST);
10345 case XML_RELAXNG_EXCEPT:
10346 case XML_RELAXNG_PARAM:
10364xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
10365 xmlRelaxNGDefinePtr
define)
10367 xmlRelaxNGStatesPtr states,
res;
10368 int i,
j,
k,
ret, oldflags;
10373 if ((ctxt->state !=
NULL) && (ctxt->states !=
NULL)) {
10374 TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10375 ctxt->state =
NULL;
10378 if ((ctxt->states ==
NULL) || (ctxt->states->nbState == 1)) {
10379 if (ctxt->states !=
NULL) {
10380 ctxt->state = ctxt->states->tabState[0];
10381 xmlRelaxNGFreeStates(ctxt, ctxt->states);
10382 ctxt->states =
NULL;
10384 ret = xmlRelaxNGValidateState(ctxt,
define);
10385 if ((ctxt->state !=
NULL) && (ctxt->states !=
NULL)) {
10386 TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10387 ctxt->state =
NULL;
10389 if ((ctxt->states !=
NULL) && (ctxt->states->nbState == 1)) {
10390 ctxt->state = ctxt->states->tabState[0];
10391 xmlRelaxNGFreeStates(ctxt, ctxt->states);
10392 ctxt->states =
NULL;
10397 states = ctxt->states;
10398 ctxt->states =
NULL;
10401 oldflags = ctxt->flags;
10402 ctxt->flags |= FLAGS_IGNORABLE;
10403 for (
i = 0;
i < states->nbState;
i++) {
10404 ctxt->state = states->tabState[
i];
10405 ctxt->states =
NULL;
10406 ret = xmlRelaxNGValidateState(ctxt,
define);
10410 if ((ctxt->state !=
NULL) && (ctxt->states !=
NULL)) {
10411 TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10412 ctxt->state =
NULL;
10415 if (ctxt->states ==
NULL) {
10418 xmlRelaxNGAddStates(ctxt,
res, ctxt->state);
10419 ctxt->state =
NULL;
10422 states->tabState[
j++] = ctxt->state;
10423 ctxt->state =
NULL;
10428 res = ctxt->states;
10429 ctxt->states =
NULL;
10430 for (
k = 0;
k <
j;
k++)
10431 xmlRelaxNGAddStates(ctxt,
res,
10432 states->tabState[
k]);
10435 for (
k = 0;
k < ctxt->states->nbState;
k++)
10436 xmlRelaxNGAddStates(ctxt,
res,
10437 ctxt->states->tabState[
k]);
10438 xmlRelaxNGFreeStates(ctxt, ctxt->states);
10439 ctxt->states =
NULL;
10443 if (ctxt->state !=
NULL) {
10444 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10445 ctxt->state =
NULL;
10446 }
else if (ctxt->states !=
NULL) {
10447 for (
k = 0;
k < ctxt->states->nbState;
k++)
10448 xmlRelaxNGFreeValidState(ctxt,
10449 ctxt->states->tabState[
k]);
10450 xmlRelaxNGFreeStates(ctxt, ctxt->states);
10451 ctxt->states =
NULL;
10455 ctxt->flags = oldflags;
10457 xmlRelaxNGFreeStates(ctxt, states);
10458 ctxt->states =
res;
10460 }
else if (
j > 1) {
10461 states->nbState =
j;
10462 ctxt->states = states;
10464 }
else if (
j == 1) {
10465 ctxt->state = states->tabState[0];
10466 xmlRelaxNGFreeStates(ctxt, states);
10470 xmlRelaxNGFreeStates(ctxt, states);
10471 if (ctxt->states !=
NULL) {
10472 xmlRelaxNGFreeStates(ctxt, ctxt->states);
10473 ctxt->states =
NULL;
10476 if ((ctxt->state !=
NULL) && (ctxt->states !=
NULL)) {
10477 TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10478 ctxt->state =
NULL;
10493xmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
10497 xmlRelaxNGGrammarPtr grammar;
10498 xmlRelaxNGValidStatePtr
state;
10501 if ((ctxt ==
NULL) || (ctxt->schema ==
NULL) || (doc ==
NULL))
10504 ctxt->errNo = XML_RELAXNG_OK;
10506 grammar =
schema->topgrammar;
10507 if (grammar ==
NULL) {
10508 VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
10511 state = xmlRelaxNGNewValidState(ctxt,
NULL);
10512 ctxt->state =
state;
10513 ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start);
10515 state = ctxt->state;
10517 node = xmlRelaxNGSkipIgnored(ctxt,
node);
10520 VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
10524 }
else if (ctxt->states !=
NULL) {
10528 for (
i = 0;
i < ctxt->states->nbState;
i++) {
10529 state = ctxt->states->tabState[
i];
10531 node = xmlRelaxNGSkipIgnored(ctxt,
node);
10534 xmlRelaxNGFreeValidState(ctxt,
state);
10538 VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
10543 if (ctxt->state !=
NULL) {
10544 xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10545 ctxt->state =
NULL;
10548 xmlRelaxNGDumpValidError(ctxt);
10549#ifdef LIBXML_VALID_ENABLED
10550 if (ctxt->idref == 1) {
10555 vctxt.error = ctxt->error;
10556 vctxt.warning = ctxt->warning;
10557 vctxt.userData = ctxt->userData;
10559 if (xmlValidateDocumentFinal(&vctxt, doc) != 1)
10563 if ((
ret == 0) && (ctxt->errNo != XML_RELAXNG_OK))
10583xmlRelaxNGCleanPSVI(xmlNodePtr
node) {
10587 ((
node->type != XML_ELEMENT_NODE) &&
10588 (
node->type != XML_DOCUMENT_NODE) &&
10589 (
node->type != XML_HTML_DOCUMENT_NODE)))
10591 if (
node->type == XML_ELEMENT_NODE)
10596 if (
cur->type == XML_ELEMENT_NODE) {
10637xmlRelaxNGValidCtxtPtr
10638xmlRelaxNGNewValidCtxt(xmlRelaxNGPtr
schema)
10640 xmlRelaxNGValidCtxtPtr
ret;
10642 ret = (xmlRelaxNGValidCtxtPtr)
xmlMalloc(
sizeof(xmlRelaxNGValidCtxt));
10644 xmlRngVErrMemory(
NULL,
"building context\n");
10647 memset(
ret, 0,
sizeof(xmlRelaxNGValidCtxt));
10660 ret->errNo = XML_RELAXNG_OK;
10671xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt)
10677 if (ctxt->states !=
NULL)
10678 xmlRelaxNGFreeStates(
NULL, ctxt->states);
10679 if (ctxt->freeState !=
NULL) {
10680 for (
k = 0;
k < ctxt->freeState->nbState;
k++) {
10681 xmlRelaxNGFreeValidState(
NULL, ctxt->freeState->tabState[
k]);
10683 xmlRelaxNGFreeStates(
NULL, ctxt->freeState);
10685 if (ctxt->freeStates !=
NULL) {
10686 for (
k = 0;
k < ctxt->freeStatesNr;
k++) {
10687 xmlRelaxNGFreeStates(
NULL, ctxt->freeStates[
k]);
10691 if (ctxt->errTab !=
NULL)
10693 if (ctxt->elemTab !=
NULL) {
10694 xmlRegExecCtxtPtr exec;
10696 exec = xmlRelaxNGElemPop(ctxt);
10697 while (exec !=
NULL) {
10698 xmlRegFreeExecCtxt(exec);
10699 exec = xmlRelaxNGElemPop(ctxt);
10716xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
10717 xmlRelaxNGValidityErrorFunc
err,
10718 xmlRelaxNGValidityWarningFunc
warn,
void *
ctx)
10723 ctxt->warning =
warn;
10724 ctxt->userData =
ctx;
10725 ctxt->serror =
NULL;
10737xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt,
10742 ctxt->serror = serror;
10743 ctxt->error =
NULL;
10744 ctxt->warning =
NULL;
10745 ctxt->userData =
ctx;
10760xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
10761 xmlRelaxNGValidityErrorFunc *
err,
10762 xmlRelaxNGValidityWarningFunc *
warn,
void **
ctx)
10767 *
err = ctxt->error;
10769 *
warn = ctxt->warning;
10771 *
ctx = ctxt->userData;
10786xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
10790 if ((ctxt ==
NULL) || (doc ==
NULL))
10795 ret = xmlRelaxNGValidateDocument(ctxt, doc);
10799 xmlRelaxNGCleanPSVI((xmlNodePtr) doc);
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
static struct loaded_include * includes
static SIZE_T const char const D3D_SHADER_MACRO * defines
int WINAPIV fprintf(FILE *file, const char *format,...)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
#define check(expected, result)
GLint GLint GLsizei GLsizei GLsizei depth
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLuint GLuint GLuint arg1
GLdouble GLdouble GLdouble GLdouble top
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
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 token
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 memcpy(s1, s2, n)
static unsigned __int64 next
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)
int xmlHashAddEntry2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2, void *payload)
xmlHashTable * xmlHashTablePtr
XMLPUBFUN xmlDocPtr xmlReadMemory(const char *buffer, int size, const char *URL, const char *encoding, int options)
XMLPUBFUN xmlDocPtr xmlReadFile(const char *URL, const char *encoding, int options)
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 void xmlAutomataSetFlags(xmlAutomataPtr am, int flags)
XML_HIDDEN xmlChar * xmlEscapeFormatString(xmlChar **msg)
Character const *const prefix
XMLPUBFUN xmlChar * xmlBuildURI(const xmlChar *URI, const xmlChar *base)
XMLPUBFUN void xmlFreeURI(xmlURIPtr uri)
XMLPUBFUN xmlChar * xmlURIEscapeStr(const xmlChar *str, const xmlChar *list)
XMLPUBFUN xmlURIPtr xmlParseURI(const char *str)
typedeftypedef void(*) typedef void(*) struct _xmlValidCtx xmlValidCtxt)
#define success(from, fromstr, to, tostr)
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
void(*) typedef void(* xmlStructuredErrorFunc)(void *userData, const xmlError *error)
void(* xmlGenericErrorFunc)(void *ctx, const char *msg,...) LIBXML_ATTR_FORMAT(2
@ XML_RNGP_UNKNOWN_TYPE_LIB
@ XML_RNGP_ELEM_TEXT_CONFLICT
@ XML_RNGP_EXCEPT_NO_CONTENT
@ XML_RNGP_PARAM_FORBIDDEN
@ XML_RNGP_GROUP_ATTR_CONFLICT
@ XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR
@ XML_RNGP_PAT_START_DATA
@ XML_RNGP_PAT_START_GROUP
@ XML_RNGP_PAT_DATA_EXCEPT_ONEMORE
@ XML_RNGP_EMPTY_CONSTRUCT
@ XML_RNGP_PARENTREF_CREATE_FAILED
@ XML_RNGP_ELEM_CONTENT_ERROR
@ XML_RNGP_DEFINE_NAME_MISSING
@ XML_RNGP_TEXT_HAS_CHILD
@ XML_RNGP_FORBIDDEN_ATTRIBUTE
@ XML_RNGP_PARENTREF_NO_PARENT
@ XML_RNGP_PAT_DATA_EXCEPT_ATTR
@ XML_RNGP_EXTERNALREF_RECURSE
@ XML_RNGP_PAT_ONEMORE_GROUP_ATTR
@ XML_RNGP_EXCEPT_MISSING
@ XML_RNGP_START_CHOICE_AND_INTERLEAVE
@ XML_RNGP_URI_NOT_ABSOLUTE
@ XML_RNGP_GRAMMAR_NO_START
@ XML_RNGP_ELEMENT_CONTENT
@ XML_RNGP_NOTALLOWED_NOT_EMPTY
@ XML_RNGP_DEF_CHOICE_AND_INTERLEAVE
@ XML_RNGP_INCLUDE_RECURSE
@ XML_RNGP_EXTERNAL_REF_FAILURE
@ XML_RNGP_PAT_START_ATTR
@ XML_RNGP_ANYNAME_ATTR_ANCESTOR
@ XML_RNGP_ERROR_TYPE_LIB
@ XML_RNGP_ELEMENT_NO_CONTENT
@ XML_RNGP_PAT_START_EMPTY
@ XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE
@ XML_RNGP_PAT_START_VALUE
@ XML_RNGP_ELEM_CONTENT_EMPTY
@ XML_RNGP_EMPTY_NOT_EMPTY
@ XML_RNGP_PAT_DATA_EXCEPT_TEXT
@ XML_RNGP_ATTRIBUTE_NOOP
@ XML_RNGP_EXCEPT_MULTIPLE
@ XML_RNGP_DEFINE_MISSING
@ XML_RNGP_UNKNOWN_CONSTRUCT
@ XML_RNGP_PAT_DATA_EXCEPT_GROUP
@ XML_RNGP_REF_CREATE_FAILED
@ XML_RNGP_INCLUDE_FAILURE
@ XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME
@ XML_RNGP_REF_NAME_INVALID
@ XML_RNGP_EXTERNALREF_EMTPY
@ XML_RNGP_PAT_START_LIST
@ XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME
@ XML_RNGP_PARENTREF_NAME_INVALID
@ XML_RNGP_ATTRIBUTE_CHILDREN
@ XML_RNGP_TYPE_NOT_FOUND
@ XML_RNGP_UNKNOWN_ATTRIBUTE
@ XML_RNGP_GRAMMAR_CONTENT
@ XML_RNGP_PREFIX_UNDEFINED
@ XML_RNGP_PAT_LIST_INTERLEAVE
@ XML_RNGP_PAT_DATA_EXCEPT_LIST
@ XML_RNGP_DEFINE_CREATE_FAILED
@ XML_RNGP_PARENTREF_NOT_EMPTY
@ XML_RNGP_ATTRIBUTE_EMPTY
@ XML_RNGP_PAT_DATA_EXCEPT_REF
@ XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME
@ XML_RNGP_INTERLEAVE_NO_CONTENT
@ XML_RNGP_FOREIGN_ELEMENT
@ XML_RNGP_VALUE_NO_CONTENT
@ XML_RNGP_PAT_START_TEXT
@ XML_RNGP_CREATE_FAILURE
@ XML_RNGP_CHOICE_CONTENT
@ XML_RNGP_INTERLEAVE_ADD
@ XML_RNGP_PAT_DATA_EXCEPT_EMPTY
@ XML_RNGP_ATTRIBUTE_CONTENT
@ XML_RNGP_INTERLEAVE_CREATE_FAILED
@ XML_RNGP_INVALID_DEFINE_NAME
@ XML_RNGP_UNKNOWN_COMBINE
@ XML_RNGP_GRAMMAR_MISSING
@ XML_RNGP_PAT_DATA_EXCEPT_ELEM
@ XML_RNGP_PAT_START_ONEMORE
@ XML_RNGP_PARAM_NAME_MISSING
@ XML_RNGP_NSNAME_ATTR_ANCESTOR
@ XML_RNGP_PARENTREF_NO_NAME
XMLPUBFUN int xmlStrlen(const xmlChar *str)
XMLPUBFUN xmlChar * xmlCharStrdup(const char *cur)
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)