15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * relaxng.c : implementation of the Relax-NG handling and validity checking 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Daniel Veillard <veillard@redhat.com> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - add support for DTD compatibility spec 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.oasis-open.org/committees/relax-ng/compatibility-20011203.html 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - report better mem allocations pbms at runtime and abort immediately. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/relaxng.h> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemastypes.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlautomata.h> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlregexp.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemastypes.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Relax-NG namespace 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *xmlRelaxNGNs = (const xmlChar *) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://relaxng.org/ns/structure/1.0"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_RELAXNG(node, type) \ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((node != NULL) && (node->ns != NULL) && \ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(node->name, (const xmlChar *) type)) && \ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(node->ns->href, xmlRelaxNGNs))) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG 1 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_GRAMMAR 1 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_CONTENT 1 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_TYPE 1 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_VALID 1 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_INTERLEAVE 1 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_LIST 1 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_INCLUDE 1 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_ERROR 1 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_COMPILE 1 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_PROGRESSIVE 1 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_ERROR 5 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TODO \ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, \ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unimplemented block at %s:%d\n", \ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __FILE__, __LINE__); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGSchema xmlRelaxNGSchema; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGDefine xmlRelaxNGDefine; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGDocument xmlRelaxNGDocument; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGInclude xmlRelaxNGInclude; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_COMBINE_UNDEFINED = 0, /* undefined */ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_COMBINE_CHOICE, /* choice */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_COMBINE_INTERLEAVE /* interleave */ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlRelaxNGCombine; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_CONTENT_ERROR = -1, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_CONTENT_EMPTY = 0, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_CONTENT_SIMPLE, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_CONTENT_COMPLEX 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlRelaxNGContentType; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGGrammar { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr parent; /* the parent grammar if any */ 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr children; /* the children grammar if any */ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr next; /* the next grammar if any */ 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr start; /* <start> content */ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCombine combine; /* the default combine value */ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr startList; /* list of <start> definitions */ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr defs; /* define* */ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr refs; /* references */ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_NOOP = -1, /* a no operation from simplification */ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_EMPTY = 0, /* an empty pattern */ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_NOT_ALLOWED, /* not allowed top */ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_EXCEPT, /* except present in nameclass defs */ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_TEXT, /* textual content */ 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ELEMENT, /* an element */ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_DATATYPE, /* extenal data type definition */ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_PARAM, /* extenal data type parameter */ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_VALUE, /* value from an extenal data type definition */ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_LIST, /* a list of patterns */ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ATTRIBUTE, /* an attrbute following a pattern */ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_DEF, /* a definition */ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_REF, /* reference to a definition */ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_EXTERNALREF, /* reference to an external def */ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_PARENTREF, /* reference to a def in the parent grammar */ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_OPTIONAL, /* optional patterns */ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ZEROORMORE, /* zero or more non empty patterns */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ONEORMORE, /* one or more non empty patterns */ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_CHOICE, /* a choice between non empty patterns */ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_GROUP, /* a pair/group of non empty patterns */ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_INTERLEAVE, /* interleaving choice of non-empty patterns */ 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_START /* Used to keep track of starts on grammars */ 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlRelaxNGType; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_NULLABLE (1 << 0) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_NOT_NULLABLE (1 << 1) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_INDETERMINIST (1 << 2) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_MIXED (1 << 3) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_TRIABLE (1 << 4) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_PROCESSED (1 << 5) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_COMPILABLE (1 << 6) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_NOT_COMPILABLE (1 << 7) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_EXTERNAL_REF (1 << 8) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGDefine { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGType type; /* the type of definition */ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; /* the node in the source */ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name; /* the element local name if present */ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ns; /* the namespace local name if present */ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value; /* value when available */ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data; /* data lib or specific pointer */ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr content; /* the expected content */ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr parent; /* the parent definition, if any */ 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr next; /* list within grouping sequences */ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr attrs; /* list of attributes for elements */ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr nameClass; /* the nameClass definition if any */ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr nextHash; /* next define in defs/refs hash tables */ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short depth; /* used for the cycle detection */ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short dflags; /* define related flags */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegexpPtr contModel; /* a compiled content model if available */ 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _xmlRelaxNG: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs definition 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNG { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *_private; /* unused by the library for users or bindings */ 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr topgrammar; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idref; /* requires idref checking */ 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr defs; /* define */ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr refs; /* references */ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr includes; /* all the includes loaded */ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int defNr; /* number of defines used */ 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_ATTRIBUTE (1 << 0) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_ONEORMORE (1 << 1) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_LIST (1 << 2) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_DATAEXCEPT (1 << 3) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_START (1 << 4) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_OOMGROUP (1 << 5) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_EXTERNALREF (1 << 7) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_ANYEXCEPT (1 << 8) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_RELAXNG_IN_NSEXCEPT (1 << 9) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGParserCtxt { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *userData; /* user specific data block */ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc serror; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErr err; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema; /* The schema in use */ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar; /* the current grammar */ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */ 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags; /* parser flags */ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbErrors; /* number of errors at parse time */ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbWarnings; /* number of warnings at parse time */ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *define; /* the current define scope */ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def; /* the current define */ 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbInterleaves; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr interleaves; /* keep track of all the interleaves */ 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr includes; /* all the includes loaded */ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URL; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr document; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int defNr; /* number of defines used */ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int defMax; /* number of defines aloocated */ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *buffer; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* the document stack */ 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr doc; /* Current parsed external ref */ 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int docNr; /* Depth of the parsing stack */ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int docMax; /* Max depth of the parsing stack */ 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr *docTab; /* array of docs */ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* the include stack */ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr inc; /* Current parsed include */ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incNr; /* Depth of the include parsing stack */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incMax; /* Max depth of the parsing stack */ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr *incTab; /* array of incs */ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idref; /* requires idref checking */ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* used to compile content models */ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataPtr am; /* the automata */ 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr state; /* used to build the automata */ 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int crng; /* compact syntax and other flags */ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int freedoc; /* need to free the document */ 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAGS_IGNORABLE 1 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAGS_NEGATIVE 2 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAGS_MIXED_CONTENT 4 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAGS_NOERROR 8 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGInterleaveGroup: 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs partition set associated to lists of definitions 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGInterleaveGroup { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr rule; /* the rule to satisfy */ 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *defs; /* the array of element definitions */ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_DETERMINIST 1 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_NEEDCHECK 2 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGPartitions: 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs partition associated to an interleave group 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGPartition xmlRelaxNGPartition; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGPartition { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbgroups; /* number of groups in the partitions */ 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr triage; /* hash table used to direct nodes to the 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * right group when possible */ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags; /* determinist ? */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGInterleaveGroupPtr *groups; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidState: 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs validation state 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_ATTR 20 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGValidState xmlRelaxNGValidState; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGValidState { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; /* the current node */ 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr seq; /* the sequence of children left to validate */ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbAttrs; /* the number of attributes */ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maxAttrs; /* the size of attrs */ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbAttrLeft; /* the number of attributes left to validate */ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value; /* the value when operating on string */ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *endvalue; /* the end value when operating on string */ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr *attrs; /* the array of attributes */ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGStates: 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs container for validation state 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGStates xmlRelaxNGStates; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGStates *xmlRelaxNGStatesPtr; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGStates { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbState; /* the number of states */ 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maxState; /* the size of the array */ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr *tabState; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ERROR_IS_DUP 1 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidError: 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs validation error 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGValidError xmlRelaxNGValidError; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGValidError { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErr err; /* the error number */ 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags; /* flags */ 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; /* the current node */ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr seq; /* the current child */ 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *arg1; /* first arg */ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *arg2; /* second arg */ 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidCtxt: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A RelaxNGs validation context 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGValidCtxt { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *userData; /* user specific data block */ 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc serror; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbErrors; /* number of errors in validation */ 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema; /* The schema in use */ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; /* the document being validated */ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags; /* validation flags */ 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int depth; /* validation depth */ 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idref; /* requires idref checking */ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int errNo; /* the first error found */ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Errors accumulated in branches may have to be stacked to be 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * provided back when it's sure they affect validation. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPtr err; /* Last error */ 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int errNr; /* Depth of the error stack */ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int errMax; /* Max depth of the error stack */ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPtr errTab; /* stack of errors */ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state; /* the current validation state */ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states; /* the accumulated state list */ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr freeState; /* the pool of free valid states */ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int freeStatesNr; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int freeStatesMax; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr *freeStates; /* the pool of free state groups */ 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is used for "progressive" validation 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr elem; /* the current element regexp */ 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int elemNr; /* the number of element validated */ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int elemMax; /* the max depth of elements */ 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pstate; /* progressive state */ 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr pnode; /* the current node */ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr pdef; /* the non-streamable definition */ 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int perr; /* signal error in content model 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * outside the regexp */ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGInclude: 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Structure associated to a RelaxNGs document element 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGInclude { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr next; /* keep a chain of includes */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href; /* the normalized href value */ 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; /* the associated XML document */ 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr content; /* the definitions */ 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema; /* the schema */ 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDocument: 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Structure associated to a RelaxNGs document element 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGDocument { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr next; /* keep a chain of documents */ 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href; /* the normalized href value */ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; /* the associated XML document */ 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr content; /* the definitions */ 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema; /* the schema */ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int externalRef; /* 1 if an external ref */ 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some factorized error routines * 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRngPErrMemory: 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an Relax-NG parser context 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra: extra informations 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a redefinition of attribute error 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc schannel = NULL; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericErrorFunc channel = NULL; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data = NULL; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->serror != NULL) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schannel = ctxt->serror; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel = ctxt->error; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = ctxt->userData; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbErrors++; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(schannel, channel, data, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, XML_FROM_RELAXNGP, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, 0, 0, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Memory allocation failed : %s\n", extra); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(schannel, channel, data, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, XML_FROM_RELAXNGP, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, 0, 0, "Memory allocation failed\n"); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRngVErrMemory: 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra: extra informations 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a redefinition of attribute error 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc schannel = NULL; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericErrorFunc channel = NULL; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data = NULL; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->serror != NULL) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schannel = ctxt->serror; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel = ctxt->error; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = ctxt->userData; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbErrors++; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(schannel, channel, data, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, XML_FROM_RELAXNGV, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, 0, 0, 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Memory allocation failed : %s\n", extra); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(schannel, channel, data, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, XML_FROM_RELAXNGV, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, 0, 0, "Memory allocation failed\n"); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRngPErr: 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node raising the error 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: message 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra info 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra info 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a Relax NG Parsing error 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *msg, const xmlChar * str1, const xmlChar * str2) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc schannel = NULL; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericErrorFunc channel = NULL; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data = NULL; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->serror != NULL) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schannel = ctxt->serror; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel = ctxt->error; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = ctxt->userData; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbErrors++; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(schannel, channel, data, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, node, XML_FROM_RELAXNGP, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, XML_ERR_ERROR, NULL, 0, 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) str1, (const char *) str2, NULL, 0, 0, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, str1, str2); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRngVErr: 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node raising the error 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: message 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra info 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra info 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a Relax NG Validation error 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *msg, const xmlChar * str1, const xmlChar * str2) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc schannel = NULL; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericErrorFunc channel = NULL; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data = NULL; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->serror != NULL) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schannel = ctxt->serror; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel = ctxt->error; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = ctxt->userData; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbErrors++; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(schannel, channel, data, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, node, XML_FROM_RELAXNGV, 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, XML_ERR_ERROR, NULL, 0, 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) str1, (const char *) str2, NULL, 0, 0, 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, str1, str2); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Preliminary type checking interfaces * 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGTypeHave: 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to check if a type is exported 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGTypeCheck: 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @result: place to store the result if needed 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to check if a value match a type 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type, 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value, void **result, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFacetCheck: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @facet: the facet name 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @val: the facet value 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @strval: the string value 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to check a value facet 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * facet, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * val, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * strval, void *value); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGTypeFree: 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @result: the value to free 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to free a returned result 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*xmlRelaxNGTypeFree) (void *data, void *result); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGTypeCompare: 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value1: the first value 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value2: the second value 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to compare two values accordingly 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to a type. 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value1, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ctxt1, 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *comp1, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value2, 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ctxt2); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlRelaxNGTypeLibrary { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *namespace; /* the datatypeLibrary value */ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data; /* data needed for the library */ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeHave have; /* the export function */ 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeCheck check; /* the checking function */ 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeCompare comp; /* the compare function */ 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFacetCheck facet; /* the facet check function */ 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeFree freef; /* the freeing function */ 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocation functions * 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGNormExtSpace(xmlChar * value); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ATTRIBUTE_UNUSED, 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state1, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state2); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeDocument: 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @docu: a document structure 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG document structure. 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu == NULL) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu->href != NULL) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(docu->href); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu->doc != NULL) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(docu->doc); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu->schema != NULL) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeInnerSchema(docu->schema); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(docu); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeDocumentList: 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @docu: a list of document structure 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG document structures. 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr next; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (docu != NULL) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = docu->next; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDocument(docu); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu = next; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeInclude: 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @incl: a include structure 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG include structure. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incl == NULL) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incl->href != NULL) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(incl->href); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incl->doc != NULL) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(incl->doc); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incl->schema != NULL) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(incl->schema); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(incl); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeIncludeList: 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @incl: a include structure list 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG include structure. 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr next; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (incl != NULL) { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = incl->next; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeInclude(incl); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incl = next; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewRelaxNG: 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context (optional) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new RelaxNG structure. 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGPtr 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr ret; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG)); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, NULL); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNG)); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeInnerSchema: 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a schema structure 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG schema structure. 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->doc != NULL) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(schema->doc); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->defTab != NULL) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < schema->defNr; i++) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDefine(schema->defTab[i]); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(schema->defTab); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(schema); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFree: 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a schema structure 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG structure. 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFree(xmlRelaxNGPtr schema) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->topgrammar != NULL) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeGrammar(schema->topgrammar); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->doc != NULL) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(schema->doc); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->documents != NULL) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDocumentList(schema->documents); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->includes != NULL) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeIncludeList(schema->includes); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->defTab != NULL) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < schema->defNr; i++) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDefine(schema->defTab[i]); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(schema->defTab); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(schema); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewGrammar: 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context (optional) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new RelaxNG grammar. 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGGrammarPtr 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr ret; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar)); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, NULL); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGGrammar)); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeGrammar: 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @grammar: a grammar structure 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG grammar structure. 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar == NULL) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->children != NULL) { 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeGrammar(grammar->children); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->next != NULL) { 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeGrammar(grammar->next); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->refs != NULL) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(grammar->refs, NULL); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->defs != NULL) { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(grammar->defs, NULL); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(grammar); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewDefine: 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the input document. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new RelaxNG define. 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr ret; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->defMax == 0) { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defMax = 16; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defNr = 0; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defTab = (xmlRelaxNGDefinePtr *) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr)); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->defTab == NULL) { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "allocating define\n"); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->defMax <= ctxt->defNr) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *tmp; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defMax *= 2; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab, 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defMax * 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGDefinePtr)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "allocating define\n"); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defTab = tmp; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine)); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "allocating define\n"); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGDefine)); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defTab[ctxt->defNr++] = ret; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->node = node; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->depth = -1; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreePartition: 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @partitions: a partition set structure 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate RelaxNG partition set structures. 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGInterleaveGroupPtr group; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partitions != NULL) { 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partitions->groups != NULL) { 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < partitions->nbgroups; j++) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = partitions->groups[j]; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group != NULL) { 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group->defs != NULL) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(group->defs); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group->attrs != NULL) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(group->attrs); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(group); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(partitions->groups); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partitions->triage != NULL) { 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(partitions->triage, NULL); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(partitions); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeDefine: 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: a define structure 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG define structure. 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define == NULL) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeLibraryPtr lib; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib = (xmlRelaxNGTypeLibraryPtr) define->data; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((lib != NULL) && (lib->freef != NULL)) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->freef(lib->data, (void *) define->attrs); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE)) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE)) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree((xmlHashTablePtr) define->data, NULL); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(define->name); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->ns != NULL) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(define->ns); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->value != NULL) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(define->value); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->contModel != NULL) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeRegexp(define->contModel); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(define); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewStates: 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size: the default size for the container 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new RelaxNG validation state container 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGStatesPtr 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr ret; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->freeStates != NULL) && (ctxt->freeStatesNr > 0)) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStatesNr--; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->freeStates[ctxt->freeStatesNr]; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbState = 0; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size < 16) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = 16; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) + 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (size - 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1) * 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlRelaxNGValidStatePtr)); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbState = 0; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxState = size; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) * 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidStatePtr)); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->tabState == NULL) { 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGAddStateUniq: 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @states: the states container 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @state: the validation state 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a RelaxNG validation state to the container without checking 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for unicity. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return 1 in case of success and 0 if this is a duplicate and -1 on error 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt, 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states, 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states->nbState >= states->maxState) { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr *tmp; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = states->maxState * 2; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (size) * 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidStatePtr)); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "adding states\n"); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->tabState = tmp; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->maxState = size; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->tabState[states->nbState++] = state; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGAddState: 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @states: the states container 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @state: the validation state 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a RelaxNG validation state to the container 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return 1 in case of success and 0 if this is a duplicate and -1 on error 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt, 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states, 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) { 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states->nbState >= states->maxState) { 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr *tmp; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = states->maxState * 2; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (size) * 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidStatePtr)); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "adding states\n"); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->tabState = tmp; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->maxState = size; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < states->nbState; i++) { 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, state); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->tabState[states->nbState++] = state; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeStates: 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @states: teh container 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a RelaxNG validation state container 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt, 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states == NULL) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->freeStates == NULL)) { 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStatesMax = 40; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStatesNr = 0; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStates = (xmlRelaxNGStatesPtr *) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr)); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->freeStates == NULL) { 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "storing states\n"); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((ctxt != NULL) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr *tmp; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates, 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2 * ctxt->freeStatesMax * 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGStatesPtr)); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "storing states\n"); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(states->tabState); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(states); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStates = tmp; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStatesMax *= 2; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->freeStates == NULL)) { 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(states->tabState); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(states); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeStates[ctxt->freeStatesNr++] = states; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewValidState: 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the current node or NULL for the document 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new RelaxNG validation state 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGValidStatePtr 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr ret; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr attr; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr attrs[MAX_ATTR]; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbAttrs = 0; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root = NULL; 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) { 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(ctxt->doc); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root == NULL) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = node->properties; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (attr != NULL) { 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbAttrs < MAX_ATTR) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrs[nbAttrs++] = attr; 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbAttrs++; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = attr->next; 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeState->nbState--; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidStatePtr) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(sizeof(xmlRelaxNGValidState)); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGValidState)); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->value = NULL; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->endvalue = NULL; 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->node = (xmlNodePtr) ctxt->doc; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->seq = root; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->node = node; 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->seq = node->children; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbAttrs = 0; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbAttrs > 0) { 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->attrs == NULL) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbAttrs < 4) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxAttrs = 4; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxAttrs = nbAttrs; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlAttrPtr)); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->attrs == NULL) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret->maxAttrs < nbAttrs) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr *tmp; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs * 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlAttrPtr)); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs = tmp; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxAttrs = nbAttrs; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbAttrs = nbAttrs; 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbAttrs < MAX_ATTR) { 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = node->properties; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbAttrs = 0; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (attr != NULL) { 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs[nbAttrs++] = attr; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = attr->next; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbAttrLeft = ret->nbAttrs; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCopyValidState: 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @state: a validation state 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the validation state 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGValidStatePtr 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt, 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr ret; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int maxAttrs; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr *attrs; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeState->nbState--; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidStatePtr) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(sizeof(xmlRelaxNGValidState)); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGValidState)); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrs = ret->attrs; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxAttrs = ret->maxAttrs; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(ret, state, sizeof(xmlRelaxNGValidState)); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs = attrs; 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxAttrs = maxAttrs; 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state->nbAttrs > 0) { 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->attrs == NULL) { 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxAttrs = state->maxAttrs; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlAttrPtr)); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->attrs == NULL) { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbAttrs = 0; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret->maxAttrs < state->nbAttrs) { 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr *tmp; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs * 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlAttrPtr)); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "allocating states\n"); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbAttrs = 0; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->maxAttrs = state->maxAttrs; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs = tmp; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(ret->attrs, state->attrs, 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->nbAttrs * sizeof(xmlAttrPtr)); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGEqualValidState: 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @state1: a validation state 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @state2: a validation state 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compare the validation states for equality 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if equald, 0 otherwise 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state1, 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state2) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((state1 == NULL) || (state2 == NULL)) 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1 == state2) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1->node != state2->node) 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1->seq != state2->seq) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1->nbAttrLeft != state2->nbAttrLeft) 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1->nbAttrs != state2->nbAttrs) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1->endvalue != state2->endvalue) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((state1->value != state2->value) && 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(state1->value, state2->value))) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < state1->nbAttrs; i++) { 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state1->attrs[i] != state2->attrs[i]) 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeValidState: 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @state: a validation state structure 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a RelaxNG validation state structure. 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->freeState == NULL)) { 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->freeState == NULL)) { 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state->attrs != NULL) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(state->attrs); 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(state); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Semi internal functions * 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxParserSetFlag: 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a RelaxNG parser context 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: a set of flags values 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Semi private function used to pass informations to a parser context 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which are a combination of xmlRelaxNGParserFlag . 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success and -1 in case of error 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) return(-1); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNGP_FREE_DOC) { 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->crng |= XML_RELAXNGP_FREE_DOC; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags -= XML_RELAXNGP_FREE_DOC; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNGP_CRNG) { 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->crng |= XML_RELAXNGP_CRNG; 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags -= XML_RELAXNGP_CRNG; 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags != 0) return(-1); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Document functions * 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGIncludePush: 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the element doc 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pushes a new include on top of the include stack 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of error, the index in the stack otherwise 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt, 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr value) 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab == NULL) { 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incMax = 4; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incNr = 0; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab = 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGIncludePtr *) xmlMalloc(ctxt->incMax * 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->incTab[0])); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab == NULL) { 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "allocating include\n"); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incNr >= ctxt->incMax) { 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incMax *= 2; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab = 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGIncludePtr *) xmlRealloc(ctxt->incTab, 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incMax * 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->incTab[0])); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab == NULL) { 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "allocating include\n"); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[ctxt->incNr] = value; 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inc = value; 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->incNr++); 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGIncludePop: 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops the top include from the include stack 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the include just removed 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGIncludePtr 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr ret; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incNr <= 0) 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incNr--; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incNr > 0) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inc = ctxt->incTab[ctxt->incNr - 1]; 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inc = NULL; 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->incTab[ctxt->incNr]; 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[ctxt->incNr] = NULL; 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGRemoveRedefine: 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the normalized URL 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the included target 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the define name to eliminate 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Applies the elimination algorithm of 4.7 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of error, 1 in case of success. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt, 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * URL ATTRIBUTE_UNUSED, 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr target, const xmlChar * name) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int found = 0; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp, tmp2; 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name2; 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == NULL) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Elimination of <include> start from %s\n", URL); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Elimination of <include> define %s from %s\n", 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, URL); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = target; 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp != NULL) { 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = tmp->next; 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) { 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = 1; 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(tmp); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(tmp); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name2 = xmlGetProp(tmp, BAD_CAST "name"); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(name2); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name2 != NULL) { 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, name2)) { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = 1; 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(tmp); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(tmp); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(name2); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(tmp, "include")) { 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href = NULL; 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr inc = tmp->psvi; 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((inc != NULL) && (inc->doc != NULL) && 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (inc->doc->children != NULL)) { 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (inc->doc->children->name, BAD_CAST "grammar")) { 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlGetProp(tmp, BAD_CAST "href"); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGRemoveRedefine(ctxt, href, 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inc->doc->children-> 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children, name) == 1) { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = 1; 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp2; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (found); 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGLoadInclude: 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the normalized URL 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the include node. 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the namespace passed from the context. 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * First lookup if the document is already loaded into the parser context, 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check against recursion. If not found the resource is loaded and 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the content is preprocessed before being returned back to the caller. 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlRelaxNGIncludePtr or NULL in case of error 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGIncludePtr 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL, 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, const xmlChar * ns) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr ret = NULL; 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root, cur; 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGLoadInclude(%s)\n", URL); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check against recursion in the stack 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->incNr; i++) { 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(ctxt->incTab[i]->href, URL)) { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_INCLUDE_RECURSE, 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Detected an Include recursion for %s\n", URL, 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * load the document 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlReadFile((const char *) URL,NULL,0); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARSE_ERROR, 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: could not load %s\n", URL, NULL); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL); 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate the document structures and register it first. 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude)); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "allocating include\n"); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(doc); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGInclude)); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = doc; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->href = xmlStrdup(URL); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->next = ctxt->includes; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->includes = ret; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transmit the ns if needed 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(doc); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root != NULL) { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHasProp(root, BAD_CAST "ns") == NULL) { 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(root, BAD_CAST "ns", ns); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * push it on the stack 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePush(ctxt, ret); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some preprocessing of the document content, this include recursing 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the include stack. 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlRelaxNGCleanupDoc(ctxt, doc); 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inc = NULL; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop up the include from the stack 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePop(ctxt); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INCLUDE 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check that the top element is a grammar 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(doc); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root == NULL) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: included document is empty %s\n", URL, 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IS_RELAXNG(root, "grammar")) { 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: included document %s root is not a grammar\n", 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL, NULL); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Elimination of redefined rules in the include. 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->children; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(cur, "start")) { 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int found = 0; 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_START_MISSING, 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: include %s has a start but not the included grammar\n", 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL, NULL); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(cur, "define")) { 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xmlGetProp(cur, BAD_CAST "name"); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == NULL) { 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_NAME_MISSING, 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: include %s has define without name\n", 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL, NULL); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int found; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(name); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = xmlRelaxNGRemoveRedefine(ctxt, URL, 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->children, name); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_MISSING, 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: include %s has a define %s but not the included grammar\n", 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL, name); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(name); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidErrorPush: 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error code 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg1: the first string argument 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg2: the second string argument 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dup: arg need to be duplicated 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pushes a new error on top of the error stack 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of error, the index in the stack otherwise 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt, 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErr err, const xmlChar * arg1, 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * arg2, int dup) 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPtr cur; 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ERROR 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Pushing error %d at %d on stack\n", err, ctxt->errNr); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errTab == NULL) { 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errMax = 8; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNr = 0; 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errTab = 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidErrorPtr) xmlMalloc(ctxt->errMax * 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidError)); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errTab == NULL) { 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "pushing error\n"); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = NULL; 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr >= ctxt->errMax) { 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errMax *= 2; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errTab = 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab, 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errMax * 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGValidError)); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errTab == NULL) { 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "pushing error\n"); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->err != NULL) && (ctxt->state != NULL) && 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err)) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->errNr); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = &ctxt->errTab[ctxt->errNr]; 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->err = err; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dup) { 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->arg1 = xmlStrdup(arg1); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->arg2 = xmlStrdup(arg2); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->flags = ERROR_IS_DUP; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->arg1 = arg1; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->arg2 = arg2; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->flags = 0; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->node = ctxt->state->node; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->seq = ctxt->state->seq; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->node = NULL; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->seq = NULL; 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = cur; 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->errNr++); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidErrorPop: 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops the top error from the error stack 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPtr cur; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr <= 0) { 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = NULL; 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNr--; 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > 0) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = NULL; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = &ctxt->errTab[ctxt->errNr]; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->flags & ERROR_IS_DUP) { 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->arg1 != NULL) 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) cur->arg1); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->arg1 = NULL; 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->arg2 != NULL) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) cur->arg2); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->arg2 = NULL; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->flags = 0; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDocumentPush: 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the element doc 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pushes a new doc on top of the doc stack 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of error, the index in the stack otherwise 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt, 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr value) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docTab == NULL) { 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docMax = 4; 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docNr = 0; 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docTab = 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGDocumentPtr *) xmlMalloc(ctxt->docMax * 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->docTab[0])); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docTab == NULL) { 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "adding document\n"); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docNr >= ctxt->docMax) { 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docMax *= 2; 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docTab = 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGDocumentPtr *) xmlRealloc(ctxt->docTab, 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docMax * 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->docTab[0])); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docTab == NULL) { 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "adding document\n"); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docTab[ctxt->docNr] = value; 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->doc = value; 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->docNr++); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDocumentPop: 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops the top doc from the doc stack 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the doc just removed 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDocumentPtr 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr ret; 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docNr <= 0) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docNr--; 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docNr > 0) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->doc = ctxt->docTab[ctxt->docNr - 1]; 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->doc = NULL; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->docTab[ctxt->docNr]; 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->docTab[ctxt->docNr] = NULL; 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGLoadExternalRef: 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the normalized URL 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the inherited ns if any 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * First lookup if the document is already loaded into the parser context, 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check against recursion. If not found the resource is loaded and 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the content is preprocessed before being returned back to the caller. 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlRelaxNGDocumentPtr or NULL in case of error 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDocumentPtr 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt, 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * URL, const xmlChar * ns) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr ret = NULL; 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root; 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check against recursion in the stack 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->docNr; i++) { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(ctxt->docTab[i]->href, URL)) { 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE, 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Detected an externalRef recursion for %s\n", URL, 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * load the document 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlReadFile((const char *) URL,NULL,0); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: could not load %s\n", URL, NULL); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate the document structures and register it first. 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument)); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY, 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL); 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(doc); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGDocument)); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = doc; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->href = xmlStrdup(URL); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->next = ctxt->documents; 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->externalRef = 1; 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->documents = ret; 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transmit the ns if needed 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(doc); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root != NULL) { 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHasProp(root, BAD_CAST "ns") == NULL) { 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(root, BAD_CAST "ns", ns); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * push it on the stack and register it in the hash table 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPush(ctxt, ret); 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some preprocessing of the document content 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlRelaxNGCleanupDoc(ctxt, doc); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->doc = NULL; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPop(ctxt); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Error functions * 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char * 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDefName(xmlRelaxNGDefinePtr def) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("none"); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (def->type) { 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("empty"); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("notAllowed"); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("except"); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("text"); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("element"); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("datatype"); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("value"); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("list"); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("attribute"); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("def"); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("ref"); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("externalRef"); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("parentRef"); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL: 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("optional"); 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE: 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("zeroOrMore"); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("oneOrMore"); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE: 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("choice"); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("group"); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("interleave"); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("start"); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("noop"); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("param"); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ("unknown"); 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGetErrorString: 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error code 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg1: the first string argument 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg2: the second string argument 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * computes a formatted error string for the given error code and args 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the error string, it must be deallocated by the caller 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar * 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1, 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * arg2) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char msg[1000]; 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg1 == NULL) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1 = BAD_CAST ""; 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg2 == NULL) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg2 = BAD_CAST ""; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg[0] = 0; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (err) { 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OK: 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_MEMORY: 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("out of memory\n")); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_TYPE: 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "failed to validate type %s\n", arg1); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_TYPEVAL: 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1, 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg2); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_DUPID: 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "ID %s redefined\n", arg1); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_TYPECMP: 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "failed to compare type %s\n", arg1); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_NOSTATE: 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Internal error: no state\n")); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_NODEFINE: 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Internal error: no define\n")); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_INTERNAL: 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Internal error: %s\n", arg1); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_LISTEXTRA: 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Extra data in list: %s\n", arg1); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_INTERNODATA: 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ("Internal: interleave block has no data\n")); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_INTERSEQ: 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Invalid sequence in interleave\n")); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_INTEREXTRA: 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Extra element %s in interleave\n", arg1); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ELEMNAME: 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1, 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg2); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ELEMNONS: 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Expecting a namespace for element %s\n", 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ELEMWRONGNS: 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s has wrong namespace: expecting %s\n", arg1, 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg2); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ELEMWRONG: 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Did not expect element %s there\n", arg1); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_TEXTWRONG: 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Did not expect text in element %s content\n", arg1); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ELEMEXTRANS: 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Expecting no namespace for element %s\n", 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ELEMNOTEMPTY: 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_NOELEM: 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Expecting an element %s, got nothing\n", 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_NOTELEM: 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Expecting an element got text\n")); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_ATTRVALID: 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Element %s failed to validate attributes\n", 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_CONTENTVALID: 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Element %s failed to validate content\n", 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_EXTRACONTENT: 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Element %s has extra content: %s\n", 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1, arg2); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_INVALIDATTR: 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Invalid attribute %s for element %s\n", 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1, arg2); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_LACKDATA: 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Datatype element %s contains no data\n", 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_DATAELEM: 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Datatype element %s has child elements\n", 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_VALELEM: 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Value element %s has child elements\n", 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_LISTELEM: 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "List element %s has child elements\n", 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_DATATYPE: 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Error validating datatype %s\n", arg1); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_VALUE: 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Error validating value %s\n", arg1); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_LIST: 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Error validating list\n")); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_NOGRAMMAR: 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("No top grammar defined\n")); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ERR_EXTRADATA: 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Extra data in the document\n")); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlCharStrdup("Unknown error !\n")); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (msg[0] == 0) { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(msg, 1000, "Unknown error code %d\n", err); 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg[1000 - 1] = 0; 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlStrdup((xmlChar *) msg)); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGShowValidError: 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error number 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @child: the node child generating the problem. 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg1: the first argument 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg2: the second argument 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Show a validation error. 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErr err, xmlNodePtr node, 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child, const xmlChar * arg1, 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * arg2) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *msg; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->flags & FLAGS_NOERROR) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ERROR 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = xmlRelaxNGGetErrorString(err, arg1, arg2); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (msg == NULL) 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNo == XML_RELAXNG_OK) 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = err; 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErr(ctxt, (child == NULL ? node : child), err, 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) msg, arg1, arg2); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(msg); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGPopErrors: 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @level: the error level in the stack 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pop and discard all errors until the given level is reached 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level) 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPtr err; 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ERROR 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Pop errors till level %d\n", level); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = level; i < ctxt->errNr; i++) { 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = &ctxt->errTab[i]; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err->flags & ERROR_IS_DUP) { 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err->arg1 != NULL) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) err->arg1); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->arg1 = NULL; 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err->arg2 != NULL) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) err->arg2); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->arg2 = NULL; 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->flags = 0; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNr = level; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr <= 0) 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->err = NULL; 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDumpValidError: 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Show all validation error over a given index. 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, k; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPtr err, dup; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ERROR 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Dumping error stack %d errors\n", ctxt->errNr); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0, k = 0; i < ctxt->errNr; i++) { 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = &ctxt->errTab[i]; 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (k < MAX_ERROR) { 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < i; j++) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dup = &ctxt->errTab[j]; 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err->err == dup->err) && (err->node == dup->node) && 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(err->arg1, dup->arg1)) && 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(err->arg2, dup->arg2))) { 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq, 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->arg1, err->arg2); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) k++; 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skip: 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err->flags & ERROR_IS_DUP) { 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err->arg1 != NULL) 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) err->arg1); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->arg1 = NULL; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err->arg2 != NULL) 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) err->arg2); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->arg2 = NULL; 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err->flags = 0; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNr = 0; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGAddValidError: 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error number 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg1: the first argument 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg2: the second argument 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dup: need to dup the args 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a validation error, either generating it if it's sure 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or stacking it for later handling if unsure. 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErr err, const xmlChar * arg1, 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * arg2, int dup) 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->flags & FLAGS_NOERROR) 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ERROR 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * generate the error directly 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((ctxt->flags & FLAGS_IGNORABLE) == 0) || 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->flags & FLAGS_NEGATIVE)) { 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, seq; 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Flush first any stacked error which might be the 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * real cause of the problem. 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr != 0) 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = ctxt->state->node; 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seq = ctxt->state->seq; 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = seq = NULL; 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node == NULL) && (seq == NULL)) { 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = ctxt->pnode; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Stack the error for later processing if needed 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Type library hooks * 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * str); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSchemaTypeHave: 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the given type is provided by 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C XMLSchema Datatype library. 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaTypePtr typ; 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == NULL) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typ = xmlSchemaGetPredefinedType(type, 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/2001/XMLSchema"); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (typ == NULL) 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSchemaTypeCheck: 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the given type and value are validated by 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C XMLSchema Datatype library. 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED, 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * type, 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value, 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void **result, xmlNodePtr node) 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaTypePtr typ; 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((type == NULL) || (value == NULL)) 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typ = xmlSchemaGetPredefinedType(type, 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/2001/XMLSchema"); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (typ == NULL) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSchemaValPredefTypeNode(typ, value, 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlSchemaValPtr *) result, node); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 2) /* special ID error code */ 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (2); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret > 0) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSchemaFacetCheck: 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @facet: the facet name 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @val: the facet value 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @strval: the string value 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to check a value facet 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED, 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * type, const xmlChar * facetname, 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * val, const xmlChar * strval, 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *value) 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFacetPtr facet; 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaTypePtr typ; 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((type == NULL) || (strval == NULL)) 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typ = xmlSchemaGetPredefinedType(type, 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/2001/XMLSchema"); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (typ == NULL) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet = xmlSchemaNewFacet(); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (facet == NULL) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) { 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_MININCLUSIVE; 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) { 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) { 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) { 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) { 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_TOTALDIGITS; 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) { 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) { 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_PATTERN; 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) { 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_ENUMERATION; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) { 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_WHITESPACE; 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "length")) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_LENGTH; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) { 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_MAXLENGTH; 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) { 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->type = XML_SCHEMA_FACET_MINLENGTH; 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeFacet(facet); 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) facet->value = val; 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSchemaCheckFacet(facet, typ, NULL, type); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeFacet(facet); 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSchemaValidateFacet(typ, facet, strval, value); 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeFacet(facet); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSchemaFreeValue: 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to free 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function provided by a type library to free a Schemas value 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value) 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValue(value); 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSchemaTypeCompare: 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value1: the first value 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value2: the second value 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compare two values for equality accordingly a type from the W3C XMLSchema 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Datatype library. 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if equal, 0 if no and -1 in case of error. 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * type, 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value1, 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ctxt1, 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *comp1, 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value2, xmlNodePtr ctxt2) 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaTypePtr typ; 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaValPtr res1 = NULL, res2 = NULL; 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((type == NULL) || (value1 == NULL) || (value2 == NULL)) 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typ = xmlSchemaGetPredefinedType(type, 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/2001/XMLSchema"); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (typ == NULL) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp1 == NULL) { 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res1 == NULL) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res1 = (xmlSchemaValPtr) comp1; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp1 == NULL) && (res1 != NULL)) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValue(res1); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res1 == NULL) { 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSchemaCompareValues(res1, res2); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res1 != (xmlSchemaValPtr) comp1) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValue(res1); 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValue(res2); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -2) 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDefaultTypeHave: 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the given type is provided by 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the default datatype library. 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED, 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * type) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == NULL) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(type, BAD_CAST "string")) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(type, BAD_CAST "token")) 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDefaultTypeCheck: 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the given type and value are validated by 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the default datatype library. 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED, 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * type ATTRIBUTE_UNUSED, 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value ATTRIBUTE_UNUSED, 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void **result ATTRIBUTE_UNUSED, 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node ATTRIBUTE_UNUSED) 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == NULL) 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(type, BAD_CAST "string")) 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(type, BAD_CAST "token")) { 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDefaultTypeCompare: 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data needed for the library 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type name 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value1: the first value 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value2: the second value 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compare two values accordingly a type from the default 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * datatype library. 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED, 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * type, 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value1, 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ctxt1 ATTRIBUTE_UNUSED, 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *comp1 ATTRIBUTE_UNUSED, 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value2, 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ctxt2 ATTRIBUTE_UNUSED) 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = -1; 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(type, BAD_CAST "string")) { 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrEqual(value1, value2); 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(type, BAD_CAST "token")) { 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(value1, value2)) { 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *nval, *nvalue; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: trivial optimizations are possible by 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * computing at compile-time 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nval = xmlRelaxNGNormalize(NULL, value1); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nvalue = xmlRelaxNGNormalize(NULL, value2); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nval == NULL) || (nvalue == NULL)) 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (xmlStrEqual(nval, nvalue)) 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nval != NULL) 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(nval); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nvalue != NULL) 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(nvalue); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGTypeInitialized = 0; 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL; 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeTypeLibrary: 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @lib: the type library structure 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespace: the URI bound to the library 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the structure associated to the type library 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib, 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * namespace ATTRIBUTE_UNUSED) 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib == NULL) 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib->namespace != NULL) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) lib->namespace); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(lib); 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGRegisterTypeLibrary: 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespace: the URI bound to the library 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: data associated to the library 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @have: the provide function 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @check: the checking function 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @comp: the comparison function 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a new type library 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error. 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data, 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeHave have, 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeCheck check, 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeCompare comp, 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFacetCheck facet, 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeFree freef) 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeLibraryPtr lib; 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) || 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (check == NULL) || (comp == NULL)) 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) { 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Relax-NG types library '%s' already registered\n", 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) namespace); 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib = 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGTypeLibraryPtr) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(sizeof(xmlRelaxNGTypeLibrary)); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib == NULL) { 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(NULL, "adding types library\n"); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(lib, 0, sizeof(xmlRelaxNGTypeLibrary)); 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->namespace = xmlStrdup(namespace); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->data = data; 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->have = have; 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->comp = comp; 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->check = check; 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->facet = facet; 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->freef = freef; 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Relax-NG types library failed to register '%s'\n", 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) namespace); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeTypeLibrary(lib, namespace); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGInitTypes: 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initilize the default type libraries. 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error. 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGInitTypes(void) 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGTypeInitialized != 0) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGRegisteredTypes = xmlHashCreate(10); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGRegisteredTypes == NULL) { 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to allocate sh table for Relax-NG types\n"); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGRegisterTypeLibrary(BAD_CAST 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/2001/XMLSchema-datatypes", 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, xmlRelaxNGSchemaTypeHave, 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSchemaTypeCheck, 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSchemaTypeCompare, 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSchemaFacetCheck, 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSchemaFreeValue); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs, NULL, 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefaultTypeHave, 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefaultTypeCheck, 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefaultTypeCompare, NULL, 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeInitialized = 1; 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCleanupTypes: 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the default Schemas type library associated to RelaxNG 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCleanupTypes(void) 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaCleanupTypes(); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGTypeInitialized == 0) 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator) 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeTypeLibrary); 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeInitialized = 0; 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compiling element content into regexp * 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sometime the element content can be compiled into a pure regexp, * 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This allows a faster execution and streamability at that level * 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* from automata.c but not exported */ 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void xmlAutomataSetFlags(xmlAutomataPtr am, int flags); 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def); 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGIsCompileable: 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to check 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if a definition is nullable. 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGIsCompileable(xmlRelaxNGDefinePtr def) 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = -1; 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) { 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->type != XML_RELAXNG_ELEMENT) && 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->dflags & IS_COMPILABLE)) 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->type != XML_RELAXNG_ELEMENT) && 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->dflags & IS_NOT_COMPILABLE)) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (def->type) { 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsCompileable(def->content); 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the element content is compileable 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((def->dflags & IS_NOT_COMPILABLE) == 0) && 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((def->dflags & IS_COMPILABLE) == 0)) { 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsCompileable(list); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Because the routine is recursive, we must guard against 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * discovering both COMPILABLE and NOT_COMPILABLE 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags &= ~IS_COMPILABLE; 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_NOT_COMPILABLE; 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE)) 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_COMPILABLE; 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_COMPILE 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) { 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "element content for %s is compilable\n", 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name); 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 0) { 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "element content for %s is not compilable\n", 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Problem in RelaxNGIsCompileable for element %s\n", 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All elements return a compileable status unless they 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are generic like anyName 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->nameClass != NULL) || (def->name == NULL)) 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->depth == -20) { 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->depth = -20; 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsCompileable(list); 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL: 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE: 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE: 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF:{ 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsCompileable(list); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_NOT_COMPILABLE; 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_COMPILABLE; 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_COMPILE 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) { 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RelaxNGIsCompileable %s : true\n", 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefName(def)); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 0) { 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RelaxNGIsCompileable %s : false\n", 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefName(def)); 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Problem in RelaxNGIsCompileable %s\n", 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefName(def)); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCompile: 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ctxt: the RelaxNG parser context 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition tree to compile 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compile the set of definitions, it works recursively, till the 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element boundaries, where it tries to compile the content if possible 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success and -1 in case of error 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (def == NULL)) 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (def->type) { 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) { 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataPtr oldam = ctxt->am; 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate = ctxt->state; 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->depth = -25; 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->am = xmlNewAutomata(); 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->am == NULL) 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * assume identical strings but not same pointer are different 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * atoms, needed for non-determinism detection 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * That way if 2 elements with the same name are in a choice 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * branch the automata is found non-deterministic and 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we fallback to the normal validation which does the right 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thing of exploring both choices. 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataSetFlags(ctxt->am, 1); 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = xmlAutomataGetInitState(ctxt->am); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, list); 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataSetFinalState(ctxt->am, ctxt->state); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->contModel = xmlAutomataCompile(ctxt->am); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegexpIsDeterminist(def->contModel); 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeAutomata(ctxt->am); 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->am = oldam; 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->am != NULL) && (def->name != NULL)) { 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = xmlAutomataNewTransition2(ctxt->am, 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state, NULL, 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, def->ns, 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataPtr oldam = ctxt->am; 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate = ctxt->state; 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->depth = -25; 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->am = xmlNewAutomata(); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->am == NULL) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataSetFlags(ctxt->am, 1); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = xmlAutomataGetInitState(ctxt->am); 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, list); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataSetFinalState(ctxt->am, ctxt->state); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->contModel = xmlAutomataCompile(ctxt->am); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlRegexpIsDeterminist(def->contModel)) { 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_COMPILE 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content model not determinist %s\n", 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we can only use the automata if it is determinist 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeRegexp(def->contModel); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->contModel = NULL; 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeAutomata(ctxt->am); 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->am = oldam; 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataPtr oldam = ctxt->am; 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we can't build the content model for this element content 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but it still might be possible to build it for some of its 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * children, recurse. 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGTryCompile(ctxt, def); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->am = oldam; 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompile(ctxt, def->content); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL:{ 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate = ctxt->state; 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, list); 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE:{ 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate; 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, list); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE:{ 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate; 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, list); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, list); 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE:{ 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr target = NULL; 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate = ctxt->state; 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompile(ctxt, list); 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target == NULL) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = ctxt->state; 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, ctxt->state, 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target); 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = target; 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompile(ctxt, list); 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT:{ 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr oldstate; 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCompile(ctxt, def->content); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewTransition(ctxt->am, ctxt->state, 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state, BAD_CAST "#text", 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This should not happen and generate an internal error */ 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "RNG internal error trying to compile %s\n", 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefName(def)); 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGTryCompile: 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ctxt: the RelaxNG parser context 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition tree to compile 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to compile the set of definitions, it works recursively, 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * possibly ignoring parts which cannot be compiled. 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success and -1 in case of error 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (def == NULL)) 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->type == XML_RELAXNG_START) || 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->type == XML_RELAXNG_ELEMENT)) { 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsCompileable(def); 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->am = NULL; 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompile(ctxt, def); 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->type == XML_RELAXNG_START) 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "compiled the start\n"); 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "compiled element %s\n", def->name); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->type == XML_RELAXNG_START) 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "failed to compile the start\n"); 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "failed to compile element %s\n", 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name); 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (def->type) { 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGTryCompile(ctxt, def->content); 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL: 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE: 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE: 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = def->content; 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGTryCompile(ctxt, list); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parsing functions * 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt, xmlNodePtr node); 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt, xmlNodePtr node); 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt, xmlNodePtr nodes, 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int group); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt, xmlNodePtr node); 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr nodes); 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt, xmlNodePtr node, 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt, xmlNodePtr nodes); 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define, 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr elem); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content)) 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGIsNullable: 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to verify 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if a definition is nullable. 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGIsNullable(xmlRelaxNGDefinePtr define) 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define == NULL) 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->dflags & IS_NULLABLE) 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->dflags & IS_NOT_NULLABLE) 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (define->type) { 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsNullable(define->content); 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE:{ 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list = define->content; 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsNullable(list); 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP:{ 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list = define->content; 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGIsNullable(list); 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done: 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->dflags |= IS_NOT_NULLABLE; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->dflags |= IS_NULLABLE; 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGIsBlank: 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str: a string 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if a string is ignorable c.f. 4.2. Whitespace 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGIsBlank(xmlChar * str) 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str == NULL) 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*str != 0) { 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(IS_BLANK_CH(*str))) 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str++; 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGetDataTypeLibrary: 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the current data or value element 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Applies algorithm from 4.3. datatypeLibrary attribute 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the datatypeLibary value or NULL if not found 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar * 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node) 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret, *escape; 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) { 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) { 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret[0] == 0) { 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (escape == NULL) { 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (escape); 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->parent; 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) { 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) { 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret[0] == 0) { 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (escape == NULL) { 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (escape); 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->parent; 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseValue: 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the data node. 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG value node. 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = NULL; 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeLibraryPtr lib = NULL; 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *type; 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *library; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int success = 0; 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_VALUE; 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = xmlGetProp(node, BAD_CAST "type"); 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != NULL) { 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(type); 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateNCName(type, 0)) { 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "value type '%s' is not an NCName\n", type, NULL); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (library == NULL) 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library = 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name = type; 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->ns = library; 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib = (xmlRelaxNGTypeLibraryPtr) 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup(xmlRelaxNGRegisteredTypes, library); 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib == NULL) { 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Use of unregistered type library '%s'\n", library, 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->data = NULL; 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->data = lib; 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib->have == NULL) { 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error with type library '%s': no 'have'\n", 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library, NULL); 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = lib->have(lib->data, def->name); 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success != 1) { 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Error type '%s' is not exported by type library '%s'\n", 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, library); 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->value = xmlStrdup(BAD_CAST ""); 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (((node->children->type != XML_TEXT_NODE) && 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->children->type != XML_CDATA_SECTION_NODE)) || 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->children->next != NULL)) { 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TEXT_EXPECTED, 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Expecting a single text value for <value>content\n", 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (def != NULL) { 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->value = xmlNodeGetContent(node); 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->value == NULL) { 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_VALUE_NO_CONTENT, 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element <value> has no content\n", NULL, NULL); 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) { 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *val = NULL; 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->check(lib->data, def->name, def->value, &val, node); 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success != 1) { 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_INVALID_VALUE, 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Value '%s' is not acceptable for type '%s'\n", 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->value, def->name); 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val != NULL) 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->attrs = val; 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseData: 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the data node. 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG data node. 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = NULL, except; 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr param, lastparam = NULL; 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeLibraryPtr lib; 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *type; 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *library; 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr content; 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmp; 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = xmlGetProp(node, BAD_CAST "type"); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == NULL) { 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL, 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(type); 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateNCName(type, 0)) { 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data type '%s' is not an NCName\n", type, NULL); 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (library == NULL) 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library = 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) { 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(type); 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_DATATYPE; 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name = type; 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->ns = library; 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib = (xmlRelaxNGTypeLibraryPtr) 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup(xmlRelaxNGRegisteredTypes, library); 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib == NULL) { 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Use of unregistered type library '%s'\n", library, 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->data = NULL; 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->data = lib; 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib->have == NULL) { 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error with type library '%s': no 'have'\n", 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library, NULL); 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = lib->have(lib->data, def->name); 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 1) { 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Error type '%s' is not exported by type library '%s'\n", 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, library); 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlStrEqual 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (library, 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/2001/XMLSchema-datatypes")) 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && ((xmlStrEqual(def->name, BAD_CAST "IDREF")) 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (xmlStrEqual(def->name, BAD_CAST "IDREFS")))) { 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->idref = 1; 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = node->children; 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle optional params 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (content != NULL) { 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(content->name, BAD_CAST "param")) 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(library, 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "http://relaxng.org/ns/structure/1.0")) { 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARAM_FORBIDDEN, 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Type library '%s' does not allow type parameters\n", 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library, NULL); 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = content->next; 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((content != NULL) && 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(content->name, BAD_CAST "param"))) 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = content->next; 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param = xmlRelaxNGNewDefine(ctxt, node); 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (param != NULL) { 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param->type = XML_RELAXNG_PARAM; 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param->name = xmlGetProp(content, BAD_CAST "name"); 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (param->name == NULL) { 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING, 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "param has no name\n", NULL, NULL); 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param->value = xmlNodeGetContent(content); 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lastparam == NULL) { 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->attrs = lastparam = param; 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastparam->next = param; 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastparam = param; 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib != NULL) { 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = content->next; 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle optional except 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((content != NULL) 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (xmlStrEqual(content->name, BAD_CAST "except"))) { 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr tmp2, last = NULL; 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except = xmlRelaxNGNewDefine(ctxt, node); 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (except == NULL) { 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except->type = XML_RELAXNG_EXCEPT; 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = content->children; 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = except; 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child == NULL) { 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT, 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "except has no content\n", NULL, NULL); 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = xmlRelaxNGParsePattern(ctxt, child); 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp2 != NULL) { 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except->content = last = tmp2; 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = tmp2; 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = tmp2; 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = content->next; 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check there is no unhandled data 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) { 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, content, XML_RNGP_DATA_CONTENT, 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element data has unexpected content %s\n", 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->name, NULL); 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *invalidName = BAD_CAST "\1"; 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCompareNameClasses: 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defs1: the first element/attribute defs 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defs2: the second element/attribute defs 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the restriction on the name 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the restriction on the namespace 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compare the 2 lists of element definitions. The comparison is 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that if both lists do not accept the same QNames, it returns 1 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the 2 lists can accept the same QName the comparison returns 0 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 disttinct, 0 if equal 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1, 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def2) 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 1; 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNode node; 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNs ns; 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidCtxt ctxt; 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt)); 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR; 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def1->type == XML_RELAXNG_ELEMENT) || 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def1->type == XML_RELAXNG_ATTRIBUTE)) { 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def2->type == XML_RELAXNG_TEXT) 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def1->name != NULL) { 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.name = def1->name; 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.name = invalidName; 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def1->ns != NULL) { 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def1->ns[0] == 0) { 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.ns = NULL; 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.ns = &ns; 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns.href = def1->ns; 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.ns = NULL; 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGElementMatch(&ctxt, def2, &node)) { 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def1->nameClass != NULL) { 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (def1->type == XML_RELAXNG_TEXT) { 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def2->type == XML_RELAXNG_TEXT) 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (def1->type == XML_RELAXNG_EXCEPT) { 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO ret = 0; 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO ret = 0; 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def2->type == XML_RELAXNG_ELEMENT) || 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def2->type == XML_RELAXNG_ATTRIBUTE)) { 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def2->name != NULL) { 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.name = def2->name; 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.name = invalidName; 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.ns = &ns; 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def2->ns != NULL) { 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def2->ns[0] == 0) { 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.ns = NULL; 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns.href = def2->ns; 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns.href = invalidName; 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGElementMatch(&ctxt, def1, &node)) { 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def2->nameClass != NULL) { 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1); 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO ret = 0; 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCompareElemDefLists: 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defs1: the first list of element/attribute defs 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defs2: the second list of element/attribute defs 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compare the 2 lists of element or attribute definitions. The comparison 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is that if both lists do not accept the same QNames, it returns 1 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the 2 lists can accept the same QName the comparison returns 0 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 disttinct, 0 if equal 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ATTRIBUTE_UNUSED, xmlRelaxNGDefinePtr * def1, 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr * def2) 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *basedef2 = def2; 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def1 == NULL) || (def2 == NULL)) 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*def1 == NULL) || (*def2 == NULL)) 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*def1 != NULL) { 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*def2) != NULL) { 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0) 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def2++; 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def2 = basedef2; 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def1++; 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGenerateAttributes: 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def: the definition definition 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the definition can only generate attributes 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if yes, 0 if no and -1 in case of error. 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt, 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def) 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr parent, cur, tmp; 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't run that check in case of error. Infinite recursion 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * becomes possible. 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors != 0) 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = NULL; 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def; 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_ELEMENT) || 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_TEXT) || 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_DATATYPE) || 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_PARAM) || 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_LIST) || 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_VALUE) || 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_EMPTY)) 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_CHOICE) || 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_INTERLEAVE) || 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_GROUP) || 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_ONEORMORE) || 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_ZEROORMORE) || 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_OPTIONAL) || 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_PARENTREF) || 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_EXTERNALREF) || 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_REF) || 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_DEF)) { 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content != NULL) { 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = cur; 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->content; 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur; 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp != NULL) { 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->parent = parent; 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == def) 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == def) 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGetElements: 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def: the definition definition 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @eora: gather elements (0) or attributes (1) 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compute the list of top elements a definition can generate 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a list of elements or NULL if none was found. 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr * 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt, 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def, int eora) 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *ret = NULL, parent, cur, tmp; 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len = 0; 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max = 0; 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't run that check in case of error. Infinite recursion 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * becomes possible. 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors != 0) 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = NULL; 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def; 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) || 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_TEXT))) || 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) { 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max = 10; 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGDefinePtr *) 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr)); 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "getting element list\n"); 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (max <= len) { 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *temp; 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max *= 2; 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp = xmlRealloc(ret, 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (max + 1) * sizeof(xmlRelaxNGDefinePtr)); 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (temp == NULL) { 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "getting element list\n"); 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = temp; 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret[len++] = cur; 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret[len] = NULL; 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((cur->type == XML_RELAXNG_CHOICE) || 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_INTERLEAVE) || 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_GROUP) || 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_ONEORMORE) || 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_ZEROORMORE) || 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_OPTIONAL) || 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_PARENTREF) || 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_REF) || 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_DEF) || 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_EXTERNALREF)) { 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't go within elements or attributes or string values. 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Just gather the element top list 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content != NULL) { 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = cur; 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->content; 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur; 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp != NULL) { 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->parent = parent; 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == def) 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == def) 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCheckChoiceDeterminism: 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def: the choice definition 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Also used to find indeterministic pattern in choice 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt, 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def) 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr **list; 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur; 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbchild = 0, i, j, ret; 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_nullable = 0; 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_indeterminist = 0; 40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr triage = NULL; 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_triable = 1; 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE)) 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->dflags & IS_PROCESSED) 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't run that check in case of error. Infinite recursion 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * becomes possible. 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors != 0) 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_nullable = xmlRelaxNGIsNullable(def); 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->content; 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbchild++; 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlRelaxNGDefinePtr 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *)); 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) { 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "building choice\n"); 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 0; 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a bit strong but safe 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_nullable == 0) { 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) triage = xmlHashCreate(10); 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_triable = 0; 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->content; 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[i] = xmlRelaxNGGetElements(ctxt, cur, 0); 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((list[i] == NULL) || (list[i][0] == NULL)) { 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_triable = 0; 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_triable == 1) { 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr *tmp; 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res; 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = list[i]; 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*tmp != NULL) && (is_triable == 1)) { 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*tmp)->type == XML_RELAXNG_TEXT) { 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(triage, 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#text", NULL, 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) cur); 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != 0) 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_triable = -1; 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((*tmp)->name != NULL)) { 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(triage, 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*tmp)->name, NULL, 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) cur); 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(triage, 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*tmp)->name, (*tmp)->ns, 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) cur); 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != 0) 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_triable = -1; 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(triage, 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#any", NULL, 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) cur); 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(triage, 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#any", (*tmp)->ns, 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) cur); 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != 0) 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_triable = -1; 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_triable = -1; 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp++; 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbchild; i++) { 41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list[i] == NULL) 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < i; j++) { 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list[j] == NULL) 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_indeterminist = 1; 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbchild; i++) { 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list[i] != NULL) 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(list[i]); 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(list); 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_indeterminist) { 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_INDETERMINIST; 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_triable == 1) { 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_TRIABLE; 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->data = triage; 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (triage != NULL) { 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(triage, NULL); 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_PROCESSED; 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCheckGroupAttrs: 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def: the group definition 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Detects violations of rule 7.3 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt, 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def) 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr **list; 42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur; 42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbchild = 0, i, j, ret; 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def == NULL) || 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((def->type != XML_RELAXNG_GROUP) && 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->type != XML_RELAXNG_ELEMENT))) 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->dflags & IS_PROCESSED) 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't run that check in case of error. Infinite recursion 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * becomes possible. 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors != 0) 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->attrs; 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbchild++; 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->content; 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbchild++; 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(xmlRelaxNGDefinePtr 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *)); 42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) { 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "building group\n"); 42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 0; 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->attrs; 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->content; 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbchild; i++) { 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list[i] == NULL) 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < i; j++) { 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list[j] == NULL) 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT, 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attributes conflicts in group\n", NULL, NULL); 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbchild; i++) { 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list[i] != NULL) 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(list[i]); 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(list); 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_PROCESSED; 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGComputeInterleaves: 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def: the interleave definition 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the definition name 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A lot of work for preprocessing interleave definitions 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is potentially needed to get a decent execution speed at runtime 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - trying to get a total order on the element nodes generated 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by the interleaves, order the list of interleave definitions 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * following that order. 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - if <text/> is used to handle mixed content, it is better to 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flag this in the define and simplify the runtime checking 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * algorithm 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def, 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ctxt, 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar * name ATTRIBUTE_UNUSED) 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur, *tmp; 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPartitionPtr partitions = NULL; 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGInterleaveGroupPtr *groups = NULL; 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGInterleaveGroupPtr group; 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, ret, res; 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbgroups = 0; 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbchild = 0; 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_mixed = 0; 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_determinist = 1; 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't run that check in case of error. Infinite recursion 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * becomes possible. 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors != 0) 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INTERLEAVE 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGComputeInterleaves(%s)\n", name); 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->content; 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbchild++; 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INTERLEAVE 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, " %d child\n", nbchild); 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups = (xmlRelaxNGInterleaveGroupPtr *) 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr)); 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (groups == NULL) 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = def->content; 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr) 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup)); 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (groups[nbgroups] == NULL) 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_RELAXNG_TEXT) 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mixed++; 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[nbgroups]->rule = cur; 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0); 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1); 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbgroups++; 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INTERLEAVE 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, " %d groups\n", nbgroups); 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Let's check that all rules makes a partitions according to 7.4 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions = (xmlRelaxNGPartitionPtr) 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(sizeof(xmlRelaxNGPartition)); 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partitions == NULL) 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(partitions, 0, sizeof(xmlRelaxNGPartition)); 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->nbgroups = nbgroups; 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->triage = xmlHashCreate(nbgroups); 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbgroups; i++) { 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = groups[i]; 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = i + 1; j < nbgroups; j++) { 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (groups[j] == NULL) 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs, 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[j]->defs); 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT, 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element or text conflicts in interleave\n", 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs, 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[j]->attrs); 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT, 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attributes conflicts in interleave\n", NULL, 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = group->defs; 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp != NULL) && (*tmp != NULL)) { 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*tmp != NULL) { 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*tmp)->type == XML_RELAXNG_TEXT) { 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(partitions->triage, 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#text", NULL, 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) (long) (i + 1)); 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != 0) 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_determinist = -1; 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((*tmp)->name != NULL)) { 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(partitions->triage, 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*tmp)->name, NULL, 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) (long) (i + 1)); 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(partitions->triage, 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*tmp)->name, (*tmp)->ns, 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) (long) (i + 1)); 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != 0) 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_determinist = -1; 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(partitions->triage, 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#any", NULL, 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) (long) (i + 1)); 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlHashAddEntry2(partitions->triage, 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#any", (*tmp)->ns, 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) (long) (i + 1)); 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*tmp)->nameClass != NULL) 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_determinist = 2; 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != 0) 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_determinist = -1; 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_determinist = -1; 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp++; 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_determinist = 0; 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->groups = groups; 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and save the partition list back in the def 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->data = partitions; 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_mixed != 0) 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_MIXED; 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_determinist == 1) 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->flags = IS_DETERMINIST; 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_determinist == 2) 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->flags = IS_DETERMINIST | IS_NEEDCHECK; 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error: 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "in interleave computation\n"); 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (groups != NULL) { 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbgroups; i++) 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (groups[i] != NULL) { 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (groups[i]->defs != NULL) 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(groups[i]->defs); 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(groups[i]); 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(groups); 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreePartition(partitions); 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseInterleave: 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the data node. 44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG interleave node. 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = NULL; 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr last = NULL, cur; 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) { 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_INTERLEAVE; 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves == NULL) 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->interleaves = xmlHashCreate(10); 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves == NULL) { 44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(ctxt, "create interleaves\n"); 44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char name[32]; 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++); 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) { 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_ADD, 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to add %s to hash table\n", 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) name, NULL); 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node->children; 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child == NULL) { 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT, 45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element interleave is empty\n", NULL, NULL); 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(child, "element")) { 45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParseElement(ctxt, child); 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParsePattern(ctxt, child); 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) { 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = def; 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = last = cur; 45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = cur; 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = cur; 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseInclude: 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the include node 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Integrate the content of an include node in the current grammar 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success or -1 in case of error 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr incl; 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root; 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, tmp; 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incl = node->psvi; 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incl == NULL) { 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_INCLUDE_EMPTY, 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Include node has no data\n", NULL, NULL); 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(incl->doc); 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root == NULL) { 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n", 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(root->name, BAD_CAST "grammar")) { 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Include document root is not a grammar\n", NULL, NULL); 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Merge the definition from both the include and the internal list 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root->children != NULL) { 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children); 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children); 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseDefine: 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the define node 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG define element node. 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success or -1 in case of error 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name; 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, tmp; 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def; 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *olddefine; 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xmlGetProp(node, BAD_CAST "name"); 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == NULL) { 45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING, 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "define has no name\n", NULL, NULL); 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(name); 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateNCName(name, 0)) { 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME, 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "define name '%s' is not an NCName\n", name, NULL); 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) { 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(name); 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_DEF; 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name = name; 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_EMPTY, 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "define has no children\n", NULL, NULL); 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) olddefine = ctxt->define; 46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->define = name; 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 0); 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->define = olddefine; 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->defs == NULL) 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar->defs = xmlHashCreate(10); 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->defs == NULL) { 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Could not create definition hash\n", NULL, NULL); 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def); 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp < 0) { 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr prev; 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlHashLookup(ctxt->grammar->defs, name); 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev == NULL) { 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error on define aggregation of %s\n", 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (prev->nextHash != NULL) 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = prev->nextHash; 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->nextHash = def; 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseImportRef: 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @payload: the parser context 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: the current grammar 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the reference name 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Import import one references into the current grammar 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseImportRef(void *payload, void *data, xmlChar *name) { 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr) data; 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload; 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmp; 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->dflags |= IS_EXTERNAL_REF; 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlHashAddEntry(ctxt->grammar->refs, name, def); 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp < 0) { 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr prev; 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = (xmlRelaxNGDefinePtr) 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup(ctxt->grammar->refs, def->name); 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev == NULL) { 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->name != NULL) { 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Error refs definitions '%s'\n", 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, NULL); 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Error refs definitions\n", 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->nextHash = prev->nextHash; 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->nextHash = def; 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseImportRefs: 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @grammar: the sub grammar 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Import references from the subgrammar into the current grammar 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of failure 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseImportRefs(xmlRelaxNGParserCtxtPtr ctxt, 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar) { 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (grammar == NULL) || (ctxt->grammar == NULL)) 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->refs == NULL) 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->refs == NULL) 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar->refs = xmlHashCreate(10); 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->refs == NULL) { 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Could not create references hash\n", NULL, NULL); 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan(grammar->refs, xmlRelaxNGParseImportRef, ctxt); 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGProcessExternalRef: 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the externlRef node 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process and compile an externlRef node 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlRelaxNGDefinePtr or NULL in case of error 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr docu; 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root, tmp; 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ns; 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int newNs = 0, oldflags; 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def; 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu = node->psvi; 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu != NULL) { 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_EXTERNALREF; 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu->content == NULL) { 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Then do the parsing for good 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(docu->doc); 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root == NULL) { 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EXTERNALREF_EMTPY, 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: %s is empty\n", ctxt->URL, 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ns transmission rules 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(root, BAD_CAST "ns"); 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = node; 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) { 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(tmp, BAD_CAST "ns"); 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->parent; 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(root, BAD_CAST "ns", ns); 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newNs = 1; 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parsing to get a precompiled schemas. 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF; 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu->schema = xmlRelaxNGParseDocument(ctxt, root); 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((docu->schema != NULL) && 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (docu->schema->topgrammar != NULL)) { 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu->content = docu->schema->topgrammar->start; 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu->schema->topgrammar->refs) 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParseImportRefs(ctxt, docu->schema->topgrammar); 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the externalRef may be reused in a different ns context 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (newNs == 1) { 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnsetProp(root, BAD_CAST "ns"); 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = docu->content; 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParsePattern: 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the pattern node. 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG pattern node. 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error or if no 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pattern is generated. 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = NULL; 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) { 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(node, "element")) { 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParseElement(ctxt, node); 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "attribute")) { 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParseAttribute(ctxt, node); 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "empty")) { 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_EMPTY; 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_NOT_EMPTY, 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "empty: had a child node\n", NULL, NULL); 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "text")) { 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_TEXT; 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_TEXT_HAS_CHILD, 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text: had a child node\n", NULL, NULL); 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "zeroOrMore")) { 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_ZEROORMORE; 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s is empty\n", node->name, NULL); 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 1); 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "oneOrMore")) { 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_ONEORMORE; 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s is empty\n", node->name, NULL); 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 1); 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "optional")) { 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_OPTIONAL; 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s is empty\n", node->name, NULL); 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 1); 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "choice")) { 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_CHOICE; 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s is empty\n", node->name, NULL); 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 0); 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "group")) { 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_GROUP; 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s is empty\n", node->name, NULL); 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 0); 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "ref")) { 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_REF; 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name = xmlGetProp(node, BAD_CAST "name"); 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->name == NULL) { 49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n", 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(def->name); 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateNCName(def->name, 0)) { 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_REF_NAME_INVALID, 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ref name '%s' is not an NCName\n", def->name, 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n", 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->refs == NULL) 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar->refs = xmlHashCreate(10); 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->refs == NULL) { 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Could not create references hash\n", NULL, NULL); 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmp; 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def); 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp < 0) { 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr prev; 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = (xmlRelaxNGDefinePtr) 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup(ctxt->grammar->refs, def->name); 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev == NULL) { 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->name != NULL) { 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Error refs definitions '%s'\n", 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, NULL); 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Error refs definitions\n", 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->nextHash = prev->nextHash; 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->nextHash = def; 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "data")) { 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParseData(ctxt, node); 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "value")) { 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParseValue(ctxt, node); 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "list")) { 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_LIST; 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s is empty\n", node->name, NULL); 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParsePatterns(ctxt, node->children, 0); 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "interleave")) { 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParseInterleave(ctxt, node); 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "externalRef")) { 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGProcessExternalRef(ctxt, node); 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "notAllowed")) { 49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_NOT_ALLOWED; 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY, 49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: notAllowed element is not empty\n", 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "grammar")) { 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar, old; 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr oldparent; 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_GRAMMAR 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found <grammar> pattern\n"); 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldparent = ctxt->parentgrammar; 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old = ctxt->grammar; 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->parentgrammar = old; 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grammar = xmlRelaxNGParseGrammar(ctxt, node->children); 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old != NULL) { 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar = old; 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->parentgrammar = oldparent; 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar != NULL) { 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grammar->next = old->next; 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old->next = grammar; 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar != NULL) 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = grammar->start; 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "parentRef")) { 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->parentgrammar == NULL) { 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT, 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Use of parentRef without a parent grammar\n", NULL, 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, node); 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_PARENTREF; 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name = xmlGetProp(node, BAD_CAST "name"); 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->name == NULL) { 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_NAME, 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "parentRef has no name\n", NULL, NULL); 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(def->name); 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateNCName(def->name, 0)) { 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID, 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "parentRef name '%s' is not an NCName\n", 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, NULL); 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY, 50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "parentRef is not empty\n", NULL, NULL); 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->parentgrammar->refs == NULL) 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->parentgrammar->refs = xmlHashCreate(10); 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->parentgrammar->refs == NULL) { 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Could not create references hash\n", NULL, NULL); 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (def->name != NULL) { 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmp; 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def); 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp < 0) { 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr prev; 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = (xmlRelaxNGDefinePtr) 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup(ctxt->parentgrammar->refs, def->name); 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev == NULL) { 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error parentRef definitions '%s'\n", 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->name, NULL); 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->nextHash = prev->nextHash; 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->nextHash = def; 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "mixed")) { 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n", 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParseInterleave(ctxt, node); 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def != NULL) { 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr tmp; 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->content != NULL) && (def->content->next != NULL)) { 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGNewDefine(ctxt, node); 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != NULL) { 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->type = XML_RELAXNG_GROUP; 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->content = def->content; 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = tmp; 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGNewDefine(ctxt, node); 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->type = XML_RELAXNG_TEXT; 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->next = def->content; 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = tmp; 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_CONSTRUCT, 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unexpected node %s is not a pattern\n", node->name, 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = NULL; 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseAttribute: 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG attribute node. 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error. 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr ret, cur; 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_flags; 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGNewDefine(ctxt, node); 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_RELAXNG_ATTRIBUTE; 51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = ctxt->def; 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node->children; 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child == NULL) { 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_EMPTY, 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParseattribute: attribute has no children\n", 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_flags = ctxt->flags; 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE; 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParseNameClass(ctxt, child, ret); 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) 51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child != NULL) { 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParsePattern(ctxt, child); 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) { 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE: 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL: 51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE: 51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = cur; 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = ret; 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CONTENT, 51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "attribute has invalid content\n", NULL, 51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_NOOP, 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RNG Internal error, noop found in attribute\n", 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child != NULL) { 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN, 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "attribute has multiple children\n", NULL, NULL); 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = old_flags; 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseExceptNameClass: 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the except node 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: 1 if within an attribute, 0 if within an element 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG nameClass node. 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error. 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt, 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, int attr) 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr ret, cur, last = NULL; 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IS_RELAXNG(node, "except")) { 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MISSING, 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Expecting an except node\n", NULL, NULL); 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->next != NULL) { 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MULTIPLE, 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exceptNameClass allows only a single except node\n", 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n", 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGNewDefine(ctxt, node); 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_RELAXNG_EXCEPT; 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node->children; 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGNewDefine(ctxt, child); 52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr) 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_ATTRIBUTE; 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_ELEMENT; 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) { 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = cur; 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = cur; 52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = cur; 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseNameClass: 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the nameClass node 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def: the current definition 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG nameClass node. 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error. 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def) 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr ret, tmp; 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *val; 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = def; 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) || 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (IS_RELAXNG(node, "nsName"))) { 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((def->type != XML_RELAXNG_ELEMENT) && 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->type != XML_RELAXNG_ATTRIBUTE)) { 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGNewDefine(ctxt, node); 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = def; 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_RELAXNG_ATTRIBUTE; 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_RELAXNG_ELEMENT; 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(node, "name")) { 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlNodeGetContent(node); 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNormExtSpace(val); 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateNCName(val, 0)) { 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->parent != NULL) 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s name '%s' is not an NCName\n", 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->parent->name, val); 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name '%s' is not an NCName\n", 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val, NULL); 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->name = val; 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlGetProp(node, BAD_CAST "ns"); 52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ns = val; 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (val != NULL) && 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) { 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute with namespace '%s' is not allowed\n", 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val, NULL); 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (val != NULL) && 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) { 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_XMLNS_NAME, 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute with QName 'xmlns' is not allowed\n", 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val, NULL); 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "anyName")) { 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->name = NULL; 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ns = NULL; 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nameClass = 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParseExceptNameClass(ctxt, node->children, 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->type == 53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ATTRIBUTE)); 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "nsName")) { 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->name = NULL; 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ns = xmlGetProp(node, BAD_CAST "ns"); 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->ns == NULL) { 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_NSNAME_NO_NS, 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nsName has no ns attribute\n", NULL, NULL); 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ret->ns != NULL) && 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) { 53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute with namespace '%s' is not allowed\n", 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ns, NULL); 53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nameClass = 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParseExceptNameClass(ctxt, node->children, 53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def->type == 53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ATTRIBUTE)); 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(node, "choice")) { 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr last = NULL; 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGNewDefine(ctxt, node); 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = def; 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_RELAXNG_CHOICE; 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children == NULL) { 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY, 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element choice is empty\n", NULL, NULL); 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node->children; 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGParseNameClass(ctxt, child, ret); 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != NULL) { 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = ret->nameClass = tmp; 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = tmp; 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = tmp; 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_CONTENT, 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expecting name, anyName, nsName or choice : got %s\n", 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node == NULL ? (const xmlChar *) "nothing" : node->name), 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != def) { 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def->nameClass == NULL) { 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->nameClass = ret; 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = def->nameClass; 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp->next != NULL) { 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->next = ret; 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseElement: 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG element node. 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error. 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr ret, cur, last; 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *olddefine; 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGNewDefine(ctxt, node); 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_RELAXNG_ELEMENT; 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = ctxt->def; 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node->children; 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child == NULL) { 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_EMPTY, 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParseElement: element has no children\n", 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParseNameClass(ctxt, child, ret); 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child == NULL) { 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT, 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParseElement: element has no content\n", 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) olddefine = ctxt->define; 54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->define = NULL; 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = NULL; 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParsePattern(ctxt, child); 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) { 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = ret; 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE: 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL: 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE: 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = last = cur; 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((last->type == XML_RELAXNG_ELEMENT) && 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ret->content == last)) { 54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = xmlRelaxNGNewDefine(ctxt, node); 54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->content != NULL) { 54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content->type = XML_RELAXNG_GROUP; 54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content->content = last; 54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = last; 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = cur; 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = cur; 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next = ret->attrs; 54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->attrs = cur; 54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RNG Internal error, start found in element\n", 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RNG Internal error, param found in element\n", 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RNG Internal error, except found in element\n", 54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RNG Internal error, noop found in element\n", 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->define = olddefine; 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParsePatterns: 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes: list of nodes 55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @group: use an implicit <group> for elements 55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG start node. 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the definition pointer or NULL in case of error. 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes, 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int group) 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent; 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = ctxt->def; 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (nodes != NULL) { 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(nodes, "element")) { 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParseElement(ctxt, nodes); 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) { 55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = last = cur; 55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) && 55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (def == last)) { 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, nodes); 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_GROUP; 55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = last; 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = cur; 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = cur; 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = parent; 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGParsePattern(ctxt, nodes); 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) { 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) { 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = last = cur; 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = cur; 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = cur; 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nodes = nodes->next; 55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (def); 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseStart: 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes: start children nodes 55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG start node. 55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error 55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def = NULL, last; 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nodes == NULL) { 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n", 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(nodes, "empty")) { 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, nodes); 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_EMPTY; 55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nodes->children != NULL) { 55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_EMPTY_CONTENT, 55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "element empty is not empty\n", NULL, NULL); 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(nodes, "notAllowed")) { 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, nodes); 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def == NULL) 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_NOT_ALLOWED; 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nodes->children != NULL) { 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY, 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "element notAllowed is not empty\n", NULL, NULL); 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGParsePatterns(ctxt, nodes, 1); 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar->start != NULL) { 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = ctxt->grammar->start; 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (last->next != NULL) 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = last->next; 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = def; 55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar->start = def; 55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nodes = nodes->next; 56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nodes != NULL) { 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_START_CONTENT, 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "start more than one children\n", NULL, NULL); 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseGrammarContent: 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes: grammar children nodes 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse the content of a RelaxNG grammar node. 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr nodes) 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, tmp; 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nodes == NULL) { 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_EMPTY, 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "grammar has no children\n", NULL, NULL); 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (nodes != NULL) { 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(nodes, "start")) { 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nodes->children == NULL) { 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "start has no children\n", NULL, NULL); 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGParseStart(ctxt, nodes->children); 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(nodes, "define")) { 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGParseDefine(ctxt, nodes); 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_RELAXNG(nodes, "include")) { 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGParseInclude(ctxt, nodes); 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "grammar has unexpected child %s\n", nodes->name, 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nodes = nodes->next; 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCheckReference: 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ref: the ref 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the name associated to the defines 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Applies the 4.17. combine attribute rule for all the define 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element of a given grammar using the same name. 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCheckReference(xmlRelaxNGDefinePtr ref, 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ctxt, 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * name) 56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar; 56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def, cur; 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Those rules don't apply to imported ref from xmlRelaxNGParseImportRef 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref->dflags & IS_EXTERNAL_REF) 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grammar = ctxt->grammar; 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar == NULL) { 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error: no grammar in CheckReference %s\n", 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref->content != NULL) { 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error: reference has content in CheckReference %s\n", 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->defs != NULL) { 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlHashLookup(grammar->defs, name); 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def != NULL) { 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ref; 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content = def; 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->nextHash; 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Reference %s has no matching definition\n", name, 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Reference %s has no matching definition\n", name, 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCheckCombine: 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the define(s) list 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the name associated to the defines 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Applies the 4.17. combine attribute rule for all the define 57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element of a given grammar using the same name. 57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCheckCombine(xmlRelaxNGDefinePtr define, 57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name) 57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *combine; 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int choiceOrInterleave = -1; 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int missing = 0; 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur, last, tmp, tmp2; 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->nextHash == NULL) 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = define; 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combine = xmlGetProp(cur->node, BAD_CAST "combine"); 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (combine != NULL) { 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(combine, BAD_CAST "choice")) { 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == -1) 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave = 1; 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (choiceOrInterleave == 0) { 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, 57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Defines for %s use both 'choice' and 'interleave'\n", 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { 57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == -1) 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave = 0; 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (choiceOrInterleave == 1) { 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Defines for %s use both 'choice' and 'interleave'\n", 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE, 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Defines for %s use unknown combine value '%s''\n", 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, combine); 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(combine); 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (missing == 0) 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) missing = 1; 57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE, 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Some defines for %s needs the combine attribute\n", 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->nextHash; 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGCheckCombine(): merging %s defines: %d\n", 57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, choiceOrInterleave); 57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == -1) 57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave = 0; 57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGNewDefine(ctxt, define->node); 57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == 0) 57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_INTERLEAVE; 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_CHOICE; 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = define; 57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = NULL; 57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp != NULL) { 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->content != NULL) { 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->content->next != NULL) { 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we need first to create a wrapper. 57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node); 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp2 == NULL) 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2->type = XML_RELAXNG_GROUP; 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2->content = tmp->content; 57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = tmp->content; 58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content = tmp2; 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = tmp2; 58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = tmp2; 58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->content = cur; 58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->nextHash; 58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->content = cur; 58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == 0) { 58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves == NULL) 58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->interleaves = xmlHashCreate(10); 58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves == NULL) { 58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to create interleaves hash table\n", NULL, 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char tmpname[32]; 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); 58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0) { 58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to add %s to hash table\n", 58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) tmpname, NULL); 58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCombineStart: 58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @grammar: the grammar 58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Applies the 4.17. combine rule for all the start 58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element of a given grammar. 58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt, 58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar) 58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr starts; 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *combine; 58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int choiceOrInterleave = -1; 58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int missing = 0; 58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur; 58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) starts = grammar->start; 58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((starts == NULL) || (starts->next == NULL)) 58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = starts; 58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->node == NULL) || (cur->node->parent == NULL) || 58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) { 58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combine = NULL; 58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING, 58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error: start element not found\n", NULL, 58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combine = xmlGetProp(cur->node->parent, BAD_CAST "combine"); 58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (combine != NULL) { 58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(combine, BAD_CAST "choice")) { 58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == -1) 58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave = 1; 58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (choiceOrInterleave == 0) { 58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, 58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<start> use both 'choice' and 'interleave'\n", 58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { 58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == -1) 58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave = 0; 58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (choiceOrInterleave == 1) { 58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, 58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<start> use both 'choice' and 'interleave'\n", 58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE, 58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<start> uses unknown combine value '%s''\n", 58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combine, NULL); 58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(combine); 58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (missing == 0) 58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) missing = 1; 58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_NEED_COMBINE, 58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Some <start> element miss the combine attribute\n", 58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGCombineStart(): merging <start>: %d\n", 59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave); 59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == -1) 59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) choiceOrInterleave = 0; 59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGNewDefine(ctxt, starts->node); 59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == 0) 59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_INTERLEAVE; 59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_CHOICE; 59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content = grammar->start; 59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grammar->start = cur; 59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (choiceOrInterleave == 0) { 59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves == NULL) 59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->interleaves = xmlHashCreate(10); 59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves == NULL) { 59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to create interleaves hash table\n", NULL, 59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char tmpname[32]; 59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); 59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0) { 59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to add %s to hash table\n", 59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) tmpname, NULL); 59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCheckCycles: 59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes: grammar children nodes 59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth: the counter 59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check for cycles. 59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if check passed, and -1 in case of error 59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt, 59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur, int depth) 59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((ret == 0) && (cur != NULL)) { 59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_REF) || 59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_PARENTREF)) { 59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->depth == -1) { 59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->depth = depth; 59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); 59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->depth = -2; 59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (depth == cur->depth) { 59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_CYCLE, 59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Detected a cycle in %s references\n", 59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, NULL); 59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_ELEMENT) { 59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1); 59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); 59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGTryUnlink: 59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the definition to unlink 59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent: the parent definition 59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prev: the previous sibling definition 59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to unlink a definition. If not possble make it a NOOP 59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new prev definition 59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGDefinePtr 59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, 59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur, 59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev) 59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev != NULL) { 59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->next = cur->next; 59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent != NULL) { 59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent->content == cur) 59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->content = cur->next; 60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (parent->attrs == cur) 60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->attrs = cur->next; 60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (parent->nameClass == cur) 60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->nameClass = cur->next; 60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_NOOP; 60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = cur; 60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (prev); 60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSimplify: 60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes: grammar children nodes 60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check for simplification of empty and notAllowed 60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt, 60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent) 60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr prev = NULL; 60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_REF) || 60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_PARENTREF)) { 60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->depth != -3) { 60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->depth = -3; 60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSimplify(ctxt, cur->content, cur); 60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { 60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = parent; 60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((parent->type == XML_RELAXNG_ATTRIBUTE) || 60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_LIST) || 60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_GROUP) || 60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_INTERLEAVE) || 60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_ONEORMORE) || 60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_ZEROORMORE))) { 60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->type = XML_RELAXNG_NOT_ALLOWED; 60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) { 60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = cur; 60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_EMPTY) { 60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = parent; 60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((parent->type == XML_RELAXNG_ONEORMORE) || 60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_ZEROORMORE))) { 60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->type = XML_RELAXNG_EMPTY; 60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((parent->type == XML_RELAXNG_GROUP) || 60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_INTERLEAVE))) { 60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = cur; 60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent = parent; 60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content != NULL) 60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSimplify(ctxt, cur->content, cur); 60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL)) 60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSimplify(ctxt, cur->attrs, cur); 60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->nameClass != NULL) 60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSimplify(ctxt, cur->nameClass, cur); 60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * On Elements, try to move attribute only generating rules on 60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the attrs rules. 60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_RELAXNG_ELEMENT) { 60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int attronly; 60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr tmp, pre; 60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur->content != NULL) { 60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attronly = 60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGenerateAttributes(ctxt, cur->content); 60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attronly == 1) { 60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * migrate cur->content to attrs 60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur->content; 60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content = tmp->next; 60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->next = cur->attrs; 60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->attrs = tmp; 60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cur->content can generate elements or text 60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pre = cur->content; 60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((pre != NULL) && (pre->next != NULL)) { 60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = pre->next; 60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp); 61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attronly == 1) { 61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * migrate tmp to attrs 61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pre->next = tmp->next; 61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->next = cur->attrs; 61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->attrs = tmp; 61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pre = tmp; 61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This may result in a simplification 61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_GROUP) || 61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_INTERLEAVE)) { 61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content == NULL) 61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_EMPTY; 61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (cur->content->next == NULL) { 61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent == NULL) && (prev == NULL)) { 61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_RELAXNG_NOOP; 61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (prev == NULL) { 61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->content = cur->content; 61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content->next = cur->next; 61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->content; 61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content->next = cur->next; 61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->next = cur->content; 61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->content; 61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the current node may have been transformed back 61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_EXCEPT) && 61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->content != NULL) && 61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) { 61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { 61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((parent->type == XML_RELAXNG_ATTRIBUTE) || 61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_LIST) || 61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_GROUP) || 61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_INTERLEAVE) || 61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_ONEORMORE) || 61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_ZEROORMORE))) { 61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->type = XML_RELAXNG_NOT_ALLOWED; 61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_CHOICE)) { 61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = cur; 61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_EMPTY) { 61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((parent->type == XML_RELAXNG_ONEORMORE) || 61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_ZEROORMORE))) { 61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->type = XML_RELAXNG_EMPTY; 61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((parent != NULL) && 61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((parent->type == XML_RELAXNG_GROUP) || 61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_INTERLEAVE) || 61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (parent->type == XML_RELAXNG_CHOICE))) { 61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = cur; 61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = cur; 61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGroupContentType: 61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ct1: the first content type 61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ct2: the second content type 61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to group 2 content types 61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the content type 61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGContentType 61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1, 61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGContentType ct2) 61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || 61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ct2 == XML_RELAXNG_CONTENT_ERROR)) 61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_ERROR); 61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ct1 == XML_RELAXNG_CONTENT_EMPTY) 61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ct2); 61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ct2 == XML_RELAXNG_CONTENT_EMPTY) 61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ct1); 61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) && 61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) 62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_COMPLEX); 62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_ERROR); 62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGMaxContentType: 62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ct1: the first content type 62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ct2: the second content type 62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compute the max content-type 62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the content type 62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGContentType 62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1, 62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGContentType ct2) 62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || 62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ct2 == XML_RELAXNG_CONTENT_ERROR)) 62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_ERROR); 62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) || 62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ct2 == XML_RELAXNG_CONTENT_SIMPLE)) 62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_SIMPLE); 62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) || 62245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) 62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_COMPLEX); 62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (XML_RELAXNG_CONTENT_EMPTY); 62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCheckRules: 62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the current definition 62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: some accumulated flags 62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ptype: the parent type 62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check for rules in section 7.1 and 7.2 62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the content type of @cur 62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGContentType 62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, 62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur, int flags, 62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGType ptype) 62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nflags; 62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY; 62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_EMPTY; 62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_RELAXNG_REF) || 62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_PARENTREF)) { 62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This should actually be caught by list//element(ref) at the 62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element boundaries, c.f. Bug #159968 local refs are dropped 62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in step 4.19. 62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_LIST) { 62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_REF, 62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern list//ref\n", NULL, 62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF, 62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//ref\n", 62675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content == NULL) { 62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_RELAXNG_PARENTREF) 62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF, 62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal found no define for parent refs\n", 62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF, 62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal found no define for ref %s\n", 62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->name ? cur->name: BAD_CAST "null"), NULL); 62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->depth > -4) { 62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->depth = -4; 62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGCheckRules(ctxt, cur->content, 62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags, cur->type); 62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->depth = ret - 15; 62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->depth == -4) { 62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_COMPLEX; 62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 62875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGContentType) (cur->depth + 15); 62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_ELEMENT) { 62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The 7.3 Attribute derivation rule for groups is plugged there 62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckGroupAttrs(ctxt, cur); 62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM, 62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//element(ref)\n", 62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_LIST) { 63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM, 63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern list//element(ref)\n", 63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, 63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern attribute//element(ref)\n", 63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, 63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern attribute//element(ref)\n", 63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reset since in the simple form elements are only child 63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of grammar/define 63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = 0; 63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type); 63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != XML_RELAXNG_CONTENT_EMPTY) { 63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY, 63235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s attributes have a content type error\n", 63245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, NULL); 63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type); 63295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == XML_RELAXNG_CONTENT_ERROR) { 63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR, 63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element %s has a content type error\n", 63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, NULL); 63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_COMPLEX; 63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_ATTRIBUTE) { 63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR, 63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern attribute//attribute\n", 63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_LIST) { 63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR, 63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern list//attribute\n", 63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_OOMGROUP) { 63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR, 63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern oneOrMore//group//attribute\n", 63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) { 63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, 63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern oneOrMore//interleave//attribute\n", 63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR, 63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//attribute\n", 63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR, 63645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//attribute\n", 63655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!(flags & XML_RELAXNG_IN_ONEORMORE)) 63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (cur->name == NULL)) { 63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->ns == NULL) { 63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR, 63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found anyName attribute without oneOrMore ancestor\n", 63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR, 63755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found nsName attribute without oneOrMore ancestor\n", 63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags | XML_RELAXNG_IN_ATTRIBUTE; 63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type); 63815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_EMPTY; 63825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((cur->type == XML_RELAXNG_ONEORMORE) || 63835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_ZEROORMORE)) { 63845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 63855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, 63865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//oneOrMore\n", 63875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 63905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE, 63915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//oneOrMore\n", 63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags | XML_RELAXNG_IN_ONEORMORE; 63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 63975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type); 63985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGGroupContentType(ret, ret); 63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_LIST) { 64005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_LIST) { 64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST, 64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern list//list\n", NULL, 64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 64065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST, 64075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//list\n", 64085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 64095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST, 64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//list\n", NULL, 64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags | XML_RELAXNG_IN_LIST; 64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 64175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 64185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type); 64195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_GROUP) { 64205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 64215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP, 64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//group\n", 64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 64265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP, 64275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//group\n", NULL, 64285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_ONEORMORE) 64315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags | XML_RELAXNG_IN_OOMGROUP; 64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags; 64345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 64365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type); 64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The 7.3 Attribute derivation rule for groups is plugged there 64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 64405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckGroupAttrs(ctxt, cur); 64415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_INTERLEAVE) { 64425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_LIST) { 64435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE, 64445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern list//interleave\n", 64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, 64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//interleave\n", 64505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, 64545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//interleave\n", 64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_ONEORMORE) 64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE; 64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags; 64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type); 64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_EXCEPT) { 64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->parent != NULL) && 64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->type == XML_RELAXNG_DATATYPE)) 64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags | XML_RELAXNG_IN_DATAEXCEPT; 64685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 64695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nflags = flags; 64705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 64715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 64725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type); 64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_DATATYPE) { 64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA, 64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//data\n", NULL, 64775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 64785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 64805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_SIMPLE; 64815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_VALUE) { 64825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE, 64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//value\n", NULL, 64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 64865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 64885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_SIMPLE; 64895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_TEXT) { 64905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_LIST) { 64915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT, 64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern list//text\n", NULL, 64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 64965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT, 64975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//text\n", 64985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 64995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 65015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT, 65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//text\n", NULL, 65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_COMPLEX; 65065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_EMPTY) { 65075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 65085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY, 65095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern data/except//empty\n", 65105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & XML_RELAXNG_IN_START) { 65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY, 65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found forbidden pattern start//empty\n", NULL, 65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 65165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = XML_RELAXNG_CONTENT_EMPTY; 65185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_RELAXNG_CHOICE) { 65195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckChoiceDeterminism(ctxt, cur); 65205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 65215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 65275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ptype == XML_RELAXNG_GROUP) { 65285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlRelaxNGGroupContentType(val, ret); 65295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ptype == XML_RELAXNG_INTERLEAVE) { 65305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 65315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: scan complain that tmp is never used, seems on purpose 65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need double-checking 65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGGroupContentType(val, ret); 65355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != XML_RELAXNG_CONTENT_ERROR) 65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGMaxContentType(val, ret); 65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ptype == XML_RELAXNG_CHOICE) { 65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlRelaxNGMaxContentType(val, ret); 65395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ptype == XML_RELAXNG_LIST) { 65405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = XML_RELAXNG_CONTENT_SIMPLE; 65415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ptype == XML_RELAXNG_EXCEPT) { 65425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == XML_RELAXNG_CONTENT_ERROR) 65435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = XML_RELAXNG_CONTENT_ERROR; 65445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = XML_RELAXNG_CONTENT_SIMPLE; 65465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlRelaxNGGroupContentType(val, ret); 65485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (val); 65525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 65535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 65555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseGrammar: 65565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes: grammar children nodes 65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a Relax-NG <grammar> node 65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the internal xmlRelaxNGGrammarPtr built or 65625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of error 65635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 65645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGGrammarPtr 65655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) 65665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 65675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr ret, tmp, old; 65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_GRAMMAR 65705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n"); 65715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGNewGrammar(ctxt); 65745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 65755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 65765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 65785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Link the new grammar in the tree 65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = ctxt->grammar; 65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar != NULL) { 65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = ctxt->grammar->children; 65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar->children = ret; 65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 65865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp->next != NULL) 65875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 65885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->next = ret; 65895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 65915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old = ctxt->grammar; 65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar = ret; 65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParseGrammarContent(ctxt, nodes); 65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar = ret; 65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar == NULL) { 65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 65985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to parse <grammar> content\n", NULL, NULL); 65995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->grammar->start == NULL) { 66005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START, 66015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element <grammar> has no <start>\n", NULL, NULL); 66025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply 4.17 mergingd rules to defines and starts 66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCombineStart(ctxt, ret); 66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->defs != NULL) { 66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine, 66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt); 66115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 66145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * link together defines and refs in this grammar 66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 66165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->refs != NULL) { 66175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference, 66185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt); 66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* @@@@ */ 66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar = old; 66255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParseDocument: 66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the root node of the RelaxNG schema 66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a Relax-NG definition resource and build an internal 66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNG struture which can be used to validate instances. 66355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the internal XML RelaxNG structure built or 66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of error 66385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGPtr 66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 66415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema = NULL; 66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *olddefine; 66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr old; 66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL)) 66475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 66485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema = xmlRelaxNGNewRelaxNG(ctxt); 66505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) 66515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 66525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) olddefine = ctxt->define; 66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->define = NULL; 66555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_RELAXNG(node, "grammar")) { 66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children); 66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 66585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr tmp, ret; 66595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt); 66615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->topgrammar == NULL) { 66625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (schema); 66635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Link the new grammar in the tree 66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = ctxt->grammar; 66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->grammar != NULL) { 66695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = ctxt->grammar->children; 66705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 66715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar->children = ret; 66725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 66735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp->next != NULL) 66745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 66755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->next = ret; 66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old = ctxt->grammar; 66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar = ret; 66805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParseStart(ctxt, node); 66815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old != NULL) 66825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->grammar = old; 66835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->define = olddefine; 66855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->topgrammar->start != NULL) { 66865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0); 66875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) { 66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL); 66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((schema->topgrammar->start != NULL) && 66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (schema->topgrammar->start->type == XML_RELAXNG_NOOP) && 66915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (schema->topgrammar->start->next != NULL)) 66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->topgrammar->start = 66935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->topgrammar->start->content; 66945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start, 66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_IN_START, XML_RELAXNG_NOOP); 66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) 67005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 67015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParseDocument() failed\n"); 67025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (schema); 67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 67085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reading RelaxNGs * 67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewParserCtxt: 67155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the location of the schema 67165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 67175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML RelaxNGs parse context for that file/resource expected 67185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to contain an XML RelaxNGs file. 67195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 67205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error 67215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 67225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParserCtxtPtr 67235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewParserCtxt(const char *URL) 67245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 67255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ret; 67265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) 67285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 67295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 67315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 67325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 67335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(NULL, "building parser\n"); 67345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 67355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 67375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->URL = xmlStrdup((const xmlChar *) URL); 67385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->error = xmlGenericError; 67395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->userData = xmlGenericErrorContext; 67405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 67415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 67445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewMemParserCtxt: 67455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer: a pointer to a char array containing the schemas 67465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size: the size of the array 67475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 67485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML RelaxNGs parse context for that memory buffer expected 67495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to contain an XML RelaxNGs file. 67505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 67515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error 67525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 67535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParserCtxtPtr 67545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewMemParserCtxt(const char *buffer, int size) 67555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 67565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ret; 67575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((buffer == NULL) || (size <= 0)) 67595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 67605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 67625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 67635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 67645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(NULL, "building parser\n"); 67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 67665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 67685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->buffer = buffer; 67695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->size = size; 67705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->error = xmlGenericError; 67715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->userData = xmlGenericErrorContext; 67725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 67735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewDocParserCtxt: 67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a preparsed document tree 67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 67795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML RelaxNGs parser context for that document. 67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note: since the process of compiling a RelaxNG schemas modifies the 67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * document, the @doc parameter is duplicated internally. 67825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 67835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error 67845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 67855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParserCtxtPtr 67865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewDocParserCtxt(xmlDocPtr doc) 67875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 67885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ret; 67895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr copy; 67905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 67925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 67935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlCopyDoc(doc, 1); 67945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) 67955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 67965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 67985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 67995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErrMemory(NULL, "building parser\n"); 68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 68025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 68045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->document = copy; 68055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->freedoc = 1; 68065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->userData = xmlGenericErrorContext; 68075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 68085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 68115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeParserCtxt: 68125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context 68135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 68145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the resources associated to the schema parser context 68155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 68165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 68175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt) 68185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 68195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 68205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->URL != NULL) 68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->URL); 68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->doc != NULL) 68245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDocument(ctxt->doc); 68255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves != NULL) 68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(ctxt->interleaves, NULL); 68275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->documents != NULL) 68285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDocumentList(ctxt->documents); 68295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->includes != NULL) 68305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeIncludeList(ctxt->includes); 68315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->docTab != NULL) 68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->docTab); 68335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab != NULL) 68345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->incTab); 68355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->defTab != NULL) { 68365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->defNr; i++) 68395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeDefine(ctxt->defTab[i]); 68405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->defTab); 68415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->document != NULL) && (ctxt->freedoc)) 68435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(ctxt->document); 68445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt); 68455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 68485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNormExtSpace: 68495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: a value 68505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 68515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Removes the leading and ending spaces of the value 68525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The string is modified "in situ" 68535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 68545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 68555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNormExtSpace(xmlChar * value) 68565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *start = value; 68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *cur = value; 68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == NULL) 68615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*cur)) 68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == start) { 68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 68675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*cur != 0) && (!IS_BLANK_CH(*cur))) 68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == 0) 68705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 68715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = cur; 68725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*cur)) 68735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 68745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == 0) { 68755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start = 0; 68765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 68775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (1); 68795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 68805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 68815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*cur != 0) && (!IS_BLANK_CH(*cur))) 68825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start++ = *cur++; 68835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == 0) { 68845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start = 0; 68855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 68865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* don't try to normalize the inner spaces */ 68885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*cur)) 68895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 68905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == 0) { 68915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start = 0; 68925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 68935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start++ = *cur++; 68955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (1); 68965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 69005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCleanupAttributes: 69015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 69025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: a Relax-NG node 69035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 69045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check all the attributes on the given node 69055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 69065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 69075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 69085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 69095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr cur, next; 69105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->properties; 69125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 69135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = cur->next; 69145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->ns == NULL) || 69155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { 69165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(cur->name, BAD_CAST "name")) { 69175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!xmlStrEqual(node->name, BAD_CAST "element")) && 69185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "attribute")) && 69195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "ref")) && 69205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "parentRef")) && 69215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "param")) && 69225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "define"))) { 69235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 69245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s is not allowed on %s\n", 69255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, node->name); 69265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, BAD_CAST "type")) { 69285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!xmlStrEqual(node->name, BAD_CAST "value")) && 69295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "data"))) { 69305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 69315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s is not allowed on %s\n", 69325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, node->name); 69335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, BAD_CAST "href")) { 69355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) && 69365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "include"))) { 69375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 69385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s is not allowed on %s\n", 69395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, node->name); 69405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) { 69425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!xmlStrEqual(node->name, BAD_CAST "start")) && 69435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->name, BAD_CAST "define"))) { 69445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 69455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s is not allowed on %s\n", 69465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, node->name); 69475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) { 69495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *val; 69505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 69515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlNodeListGetString(node->doc, cur->children, 1); 69535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val != NULL) { 69545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val[0] != 0) { 69555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *) val); 69565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 69575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_INVALID_URI, 69585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s contains invalid URI %s\n", 69595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, val); 69605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 69615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri->scheme == NULL) { 69625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_URI_NOT_ABSOLUTE, 69635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s URI %s is not absolute\n", 69645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, val); 69655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri->fragment != NULL) { 69675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_URI_FRAGMENT, 69685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute %s URI %s has a fragment ID\n", 69695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name, val); 69705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 69725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(val); 69755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) { 69775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_ATTRIBUTE, 69785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unknown attribute %s on %s\n", cur->name, 69795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->name); 69805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = next; 69835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 69855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 69875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCleanupTree: 69885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 69895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @root: an xmlNodePtr subtree 69905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 69915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the subtree from unwanted nodes for parsing, resolve 69925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Include and externalRef lookups. 69935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 69945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 69955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) 69965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 69975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, delete; 69985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = NULL; 70005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = root; 70015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 70025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete != NULL) { 70035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(delete); 70045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(delete); 70055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = NULL; 70065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_ELEMENT_NODE) { 70085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 70095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simplification 4.1. Annotations 70105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 70115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->ns == NULL) || 70125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { 70135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->parent != NULL) && 70145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->type == XML_ELEMENT_NODE) && 70155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) || 70165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(cur->parent->name, BAD_CAST "value")) || 70175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) { 70185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_FOREIGN_ELEMENT, 70195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "element %s doesn't allow foreign elements\n", 70205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent->name, NULL); 70215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 70235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 70245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 70255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCleanupAttributes(ctxt, cur); 70265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) { 70275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href, *ns, *base, *URL; 70285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDocumentPtr docu; 70295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp; 70305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 70315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(cur, BAD_CAST "ns"); 70335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 70345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur->parent; 70355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((tmp != NULL) && 70365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (tmp->type == XML_ELEMENT_NODE)) { 70375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(tmp, BAD_CAST "ns"); 70385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 70395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 70405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->parent; 70415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlGetProp(cur, BAD_CAST "href"); 70445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href == NULL) { 70455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, 70465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: externalRef has no href attribute\n", 70475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 70485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 70495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 70505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 70515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 70525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *) href); 70545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 70555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 70565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Incorrect URI for externalRef %s\n", 70575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href, NULL); 70585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 70595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 70605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 70615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 70625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 70635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 70645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri->fragment != NULL) { 70665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 70675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Fragment forbidden in URI for externalRef %s\n", 70685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href, NULL); 70695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 70705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 70715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 70725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 70735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 70745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 70755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 70765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 70785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlNodeGetBase(cur->doc, cur); 70795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlBuildURI(href, base); 70805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) { 70815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 70825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to compute URL for externalRef %s\n", 70835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href, NULL); 70845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 70855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 70865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 70875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 70885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 70895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 70905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 70915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 70925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 70935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 70945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 70955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 70965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 70975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu = xmlRelaxNGLoadExternalRef(ctxt, URL, ns); 70985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu == NULL) { 70995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE, 71005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to load externalRef %s\n", URL, 71015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 71025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 71035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 71045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 71055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 71065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 71075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 71095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 71105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 71115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->psvi = docu; 71125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, BAD_CAST "include")) { 71135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href, *ns, *base, *URL; 71145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGIncludePtr incl; 71155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp; 71165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlGetProp(cur, BAD_CAST "href"); 71185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href == NULL) { 71195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, 71205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: include has no href attribute\n", 71215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 71225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 71235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 71245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlNodeGetBase(cur->doc, cur); 71265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlBuildURI(href, base); 71275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) { 71285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 71295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to compute URL for include %s\n", 71305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href, NULL); 71315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 71325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 71335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 71345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 71355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 71365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 71375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 71395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 71405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 71415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 71425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(cur, BAD_CAST "ns"); 71435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 71445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur->parent; 71455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((tmp != NULL) && 71465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (tmp->type == XML_ELEMENT_NODE)) { 71475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(tmp, BAD_CAST "ns"); 71485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 71495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 71505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->parent; 71515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns); 71545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 71555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 71565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incl == NULL) { 71575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_INCLUDE_FAILURE, 71585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to load include %s\n", URL, 71595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 71605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 71615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 71625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 71635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 71655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->psvi = incl; 71665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) || 71675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(cur->name, BAD_CAST "attribute"))) 71685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 71695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name, *ns; 71705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr text = NULL; 71715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 71735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simplification 4.8. name attribute of element 71745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and attribute elements 71755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 71765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xmlGetProp(cur, BAD_CAST "name"); 71775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name != NULL) { 71785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children == NULL) { 71795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = 71805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNewChild(cur, cur->ns, BAD_CAST "name", 71815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name); 71825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 71835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 71845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlNewDocNode(cur->doc, cur->ns, 71865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "name", NULL); 71875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node != NULL) { 71885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddPrevSibling(cur->children, node); 71895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = xmlNewText(name); 71905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddChild(node, text); 71915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = node; 71925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text == NULL) { 71955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, XML_RNGP_CREATE_FAILURE, 71965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to create a name %s element\n", 71975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, NULL); 71985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 71995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnsetProp(cur, BAD_CAST "name"); 72005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(name); 72015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(cur, BAD_CAST "ns"); 72025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 72035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text != NULL) { 72045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(text, BAD_CAST "ns", ns); 72055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* xmlUnsetProp(cur, BAD_CAST "ns"); */ 72065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 72085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, 72095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "attribute")) { 72105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(text, BAD_CAST "ns", BAD_CAST ""); 72115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) || 72145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(cur->name, BAD_CAST "nsName")) || 72155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(cur->name, BAD_CAST "value"))) { 72165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 72175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simplification 4.8. name attribute of element 72185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and attribute elements 72195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 72205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHasProp(cur, BAD_CAST "ns") == NULL) { 72215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 72225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ns = NULL; 72235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = cur->parent; 72255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((node != NULL) && 72265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_ELEMENT_NODE)) { 72275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(node, BAD_CAST "ns"); 72285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 72295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 72305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->parent; 72325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 72345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(cur, BAD_CAST "ns", BAD_CAST ""); 72355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 72365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(cur, BAD_CAST "ns", ns); 72375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 72385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(cur->name, BAD_CAST "name")) { 72415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name, *local, *prefix; 72425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 72445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simplification: 4.10. QNames 72455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 72465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xmlNodeGetContent(cur); 72475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name != NULL) { 72485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local = xmlSplitQName2(name, &prefix); 72495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (local != NULL) { 72505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 72515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNs(cur->doc, cur, prefix); 72535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 72545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, 72555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RNGP_PREFIX_UNDEFINED, 72565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: no namespace for prefix %s\n", 72575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix, NULL); 72585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 72595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(cur, BAD_CAST "ns", 72605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns->href); 72615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetContent(cur, local); 72625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(local); 72645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prefix); 72655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(name); 72675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 72705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4.16 72715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 72725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(cur->name, BAD_CAST "nsName")) { 72735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 72745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, 72755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, 72765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found nsName/except//nsName forbidden construct\n", 72775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 72785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 72805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) && 72815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur != root)) { 72825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldflags = ctxt->flags; 72835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 72855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4.16 72865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 72875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->parent != NULL) && 72885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual 72895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->name, BAD_CAST "anyName"))) { 72905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT; 72915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCleanupTree(ctxt, cur); 72925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 72935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 72945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((cur->parent != NULL) && 72955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual 72965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->name, BAD_CAST "nsName"))) { 72975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT; 72985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCleanupTree(ctxt, cur); 72995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 73005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 73015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) { 73035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 73045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4.16 73055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 73065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) { 73075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, 73085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, 73095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found anyName/except//anyName forbidden construct\n", 73105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 73115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 73125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, cur, 73135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, 73145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found nsName/except//anyName forbidden construct\n", 73155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL); 73165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 73195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Thisd is not an else since "include" is transformed 73205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * into a div 73215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 73225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(cur->name, BAD_CAST "div")) { 73235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ns; 73245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child, ins, tmp; 73255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 73275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implements rule 4.11 73285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 73295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlGetProp(cur, BAD_CAST "ns"); 73315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = cur->children; 73335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ins = cur; 73345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 73355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 73365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlHasProp(child, BAD_CAST "ns")) { 73375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSetProp(child, BAD_CAST "ns", ns); 73385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = child->next; 73415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(child); 73425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ins = xmlAddNextSibling(ins, child); 73435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = tmp; 73445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 73465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ns); 73475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 73485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Since we are about to delete cur, if it's nsDef is non-NULL we 73495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need to preserve it (it contains the ns definitions for the 73505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * children we just moved). We'll just stick it on to the end 73515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of cur->parent's list, since it's never going to be re-serialized 73525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (bug 143738). 73535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 73545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->nsDef != NULL) { 73555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef; 73565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (parDef->next != NULL) 73575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parDef = parDef->next; 73585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parDef->next = cur->nsDef; 73595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->nsDef = NULL; 73605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 73625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 73635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 73675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simplification 4.2 whitespaces 73685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 73695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((cur->type == XML_TEXT_NODE) || 73705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_CDATA_SECTION_NODE)) { 73715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_BLANK_NODE(cur)) { 73725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->parent->type == XML_ELEMENT_NODE) { 73735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value")) 73745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && 73755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual 73765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->name, BAD_CAST "param"))) 73775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 73785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 73795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 73805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 73815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 73845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 73855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 73865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 73895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip to next node 73905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 73915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children != NULL) { 73925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->children->type != XML_ENTITY_DECL) && 73935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->children->type != XML_ENTITY_REF_NODE) && 73945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->children->type != XML_ENTITY_NODE)) { 73955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->children; 73965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 73975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 73995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skip_children: 74005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 74015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 74025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 74035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 74065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 74075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 74085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 74095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == root) { 74105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = NULL; 74115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 74125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 74145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 74155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 74165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 74185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete != NULL) { 74205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(delete); 74215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(delete); 74225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = NULL; 74235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 74255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 74275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCleanupDoc: 74285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 74295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: an xmldocPtr document pointer 74305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 74315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the document from unwanted nodes for parsing, resolve 74325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Include and externalRef lookups. 74335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 74345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the cleaned up document or NULL in case of error 74355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 74365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlDocPtr 74375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc) 74385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 74395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root; 74405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 74425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extract the root 74435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 74445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(doc); 74455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root == NULL) { 74465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 74475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->URL, NULL); 74485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 74495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCleanupTree(ctxt, root); 74515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (doc); 74525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 74535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 74555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGParse: 74565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 74575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 74585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a schema definition resource and build an internal 74595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML Shema struture which can be used to validate instances. 74605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 74615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the internal XML RelaxNG structure built from the resource or 74625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of error 74635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 74645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGPtr 74655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt) 74665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 74675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr ret = NULL; 74685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 74695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root; 74705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGInitTypes(); 74725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 74745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 74755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 74775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * First step is to parse the input document into an DOM/Infoset 74785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 74795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->URL != NULL) { 74805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlReadFile((const char *) ctxt->URL,NULL,0); 74815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 74825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 74835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: could not load %s\n", ctxt->URL, 74845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 74855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 74865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->buffer != NULL) { 74885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0); 74895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 74905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 74915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: could not parse schemas\n", NULL, 74925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 74935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 74945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 74965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 74975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->document != NULL) { 74985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt->document; 74995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 75005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, NULL, XML_RNGP_EMPTY, 75015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGParse: nothing to parse\n", NULL, NULL); 75025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 75035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = doc; 75055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some preprocessing of the document content 75085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlRelaxNGCleanupDoc(ctxt, doc); 75105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 75115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(ctxt->document); 75125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = NULL; 75135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 75145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Then do the parsing for good 75185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(doc); 75205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root == NULL) { 75215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngPErr(ctxt, (xmlNodePtr) doc, 75225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 75235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL); 75245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(ctxt->document); 75265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = NULL; 75275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 75285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGParseDocument(ctxt, root); 75305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 75315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(ctxt->document); 75325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = NULL; 75335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 75345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the ref/defines links 75385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * try to preprocess interleaves 75415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->interleaves != NULL) { 75435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan(ctxt->interleaves, 75445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt); 75455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if there was a parsing error return NULL 75495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors > 0) { 75515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(ret); 75525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = NULL; 75535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(doc); 75545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 75555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * try to compile (parts of) the schemas 75595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) { 75615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->topgrammar->start->type != XML_RELAXNG_START) { 75625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr def; 75635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def = xmlRelaxNGNewDefine(ctxt, NULL); 75655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (def != NULL) { 75665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->type = XML_RELAXNG_START; 75675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def->content = ret->topgrammar->start; 75685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->topgrammar->start = def; 75695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start); 75725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 75735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 75755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Transfer the pointer for cleanup at the schema level. 75765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 75775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = doc; 75785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = NULL; 75795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->documents = ctxt->documents; 75805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->documents = NULL; 75815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->includes = ctxt->includes; 75835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->includes = NULL; 75845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->defNr = ctxt->defNr; 75855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->defTab = ctxt->defTab; 75865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->defTab = NULL; 75875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->idref == 1) 75885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->idref = 1; 75895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 75915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 75925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 75945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSetParserErrors: 75955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 75965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error callback 75975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning callback 75985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: contextual data for the callbacks 75995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 76005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the callback functions used to handle errors for a validation context 76015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 76025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 76035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, 76045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityErrorFunc err, 76055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityWarningFunc warn, void *ctx) 76065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 76075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 76085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 76095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->error = err; 76105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->warning = warn; 76115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->serror = NULL; 76125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->userData = ctx; 76135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 76145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 76165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGetParserErrors: 76175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 76185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error callback result 76195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning callback result 76205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: contextual data for the callbacks result 76215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 76225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the callback information used to handle errors for a validation context 76235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 76245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of failure, 0 otherwise. 76255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 76265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 76275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, 76285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityErrorFunc * err, 76295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityWarningFunc * warn, void **ctx) 76305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 76315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 76325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 76335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err != NULL) 76345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *err = ctxt->error; 76355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (warn != NULL) 76365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *warn = ctxt->warning; 76375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctx != NULL) 76385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ctx = ctxt->userData; 76395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 76405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 76415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 76435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSetParserStructuredErrors: 76445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG parser context 76455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @serror: the error callback 76465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: contextual data for the callbacks 76475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 76485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the callback functions used to handle errors for a parsing context 76495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 76505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 76515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt, 76525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc serror, 76535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *ctx) 76545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 76555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 76565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 76575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->serror = serror; 76585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->error = NULL; 76595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->warning = NULL; 76605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->userData = ctx; 76615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 76625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED 76645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 76665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 76675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump back a compiled form * 76685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 76695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 76705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGDumpDefine(FILE * output, 76715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define); 76725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 76745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDumpDefines: 76755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the file output 76765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defines: a list of define structures 76775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 76785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a RelaxNG structure back 76795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 76805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 76815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines) 76825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 76835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (defines != NULL) { 76845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefine(output, defines); 76855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defines = defines->next; 76865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 76875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 76885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 76905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDumpDefine: 76915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the file output 76925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: a define structure 76935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 76945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a RelaxNG structure back 76955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 76965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 76975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define) 76985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 76995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define == NULL) 77005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 77015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (define->type) { 77025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 77035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<empty/>\n"); 77045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 77065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<notAllowed/>\n"); 77075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 77095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<text/>\n"); 77105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 77125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<element>\n"); 77135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) { 77145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<name"); 77155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->ns != NULL) 77165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " ns=\"%s\"", define->ns); 77175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, ">%s</name>\n", define->name); 77185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 77195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->attrs); 77205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</element>\n"); 77225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST: 77245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<list>\n"); 77255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</list>\n"); 77275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 77295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<oneOrMore>\n"); 77305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</oneOrMore>\n"); 77325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE: 77345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<zeroOrMore>\n"); 77355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</zeroOrMore>\n"); 77375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE: 77395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<choice>\n"); 77405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</choice>\n"); 77425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 77445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<group>\n"); 77455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</group>\n"); 77475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 77495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<interleave>\n"); 77505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</interleave>\n"); 77525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL: 77545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<optional>\n"); 77555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</optional>\n"); 77575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 77595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<attribute>\n"); 77605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</attribute>\n"); 77625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 77645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<define"); 77655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) 77665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " name=\"%s\"", define->name); 77675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, ">\n"); 77685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</define>\n"); 77705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 77725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<ref"); 77735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) 77745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " name=\"%s\"", define->name); 77755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, ">\n"); 77765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</ref>\n"); 77785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 77805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<parentRef"); 77815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) 77825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " name=\"%s\"", define->name); 77835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, ">\n"); 77845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</parentRef>\n"); 77865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 77885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<externalRef>"); 77895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 77905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</externalRef>\n"); 77915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 77925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE: 77935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE: 77945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO break; 77955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 77965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 77975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 77985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO break; 77995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 78005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefines(output, define->content); 78015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 78025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 78045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 78065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDumpGrammar: 78075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the file output 78085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @grammar: a grammar structure 78095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @top: is this a top grammar 78105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 78115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a RelaxNG structure back 78125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 78135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 78145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top) 78155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 78165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar == NULL) 78175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 78185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<grammar"); 78205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (top) 78215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\""); 78225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (grammar->combine) { 78235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_COMBINE_UNDEFINED: 78245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 78255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_COMBINE_CHOICE: 78265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " combine=\"choice\""); 78275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 78285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_COMBINE_INTERLEAVE: 78295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " combine=\"interleave\""); 78305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 78315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 78325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " <!-- invalid combine value -->"); 78335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, ">\n"); 78355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar->start == NULL) { 78365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, " <!-- grammar had no start -->"); 78375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 78385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "<start>\n"); 78395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpDefine(output, grammar->start); 78405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</start>\n"); 78415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO ? Dump the defines ? */ 78435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "</grammar>\n"); 78445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 78455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 78475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDump: 78485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the file output 78495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a schema structure 78505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 78515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a RelaxNG structure back 78525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 78535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 78545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema) 78555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 78565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output == NULL) 78575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 78585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) { 78595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "RelaxNG empty or failed to compile\n"); 78605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 78615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "RelaxNG: "); 78635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->doc == NULL) { 78645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "no document\n"); 78655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (schema->doc->URL != NULL) { 78665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "%s\n", schema->doc->URL); 78675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 78685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "\n"); 78695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->topgrammar == NULL) { 78715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "RelaxNG has no top grammar\n"); 78725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 78735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1); 78755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 78765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 78785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGDumpTree: 78795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the file output 78805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a schema structure 78815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 78825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump the transformed RelaxNG tree. 78835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 78845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 78855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) 78865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 78875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output == NULL) 78885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 78895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) { 78905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "RelaxNG empty or failed to compile\n"); 78915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 78925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema->doc == NULL) { 78945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(output, "no document\n"); 78955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 78965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocDump(output, schema->doc); 78975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 78995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */ 79005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 79025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 79035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validation of compiled content * 79045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 79055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 79065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 79075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define); 79085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 79105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateCompiledCallback: 79115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @exec: the regular expression instance 79125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @token: the token which matched 79135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @transdata: callback data, the define for the subelement if available 79145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @ @inputdata: callback data, the Relax NG validation context 79155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 79165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle the callback and if needed validate the element children. 79175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 79185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 79195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, 79205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * token, 79215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *transdata, void *inputdata) 79225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 79235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; 79245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; 79255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 79265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_COMPILE 79285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 79295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Compiled callback for: '%s'\n", token); 79305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 79315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) { 79325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s missing context\n", token); 79335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 79345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 79355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define == NULL) { 79365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (token[0] == '#') 79375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 79385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s missing define\n", token); 79395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 79405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 79415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 79425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 79435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (define == NULL)) { 79445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s missing info\n", token); 79455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 79465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 79475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 79485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (define->type != XML_RELAXNG_ELEMENT) { 79495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s define is not element\n", token); 79505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNo == XML_RELAXNG_OK) 79515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 79525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 79535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 79545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, define); 79555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 79565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->perr = ret; 79575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 79585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 79605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateCompiledContent: 79615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the RelaxNG validation context 79625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @regexp: the regular expression as compiled 79635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: list of children to test against the regexp 79645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 79655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the content model of an element or start using the regexp 79665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 79675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error. 79685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 79695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 79705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, 79715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegexpPtr regexp, xmlNodePtr content) 79725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 79735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr exec; 79745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 79755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 79765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldperr; 79775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (regexp == NULL)) 79795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 79805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldperr = ctxt->perr; 79815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRegNewExecCtxt(regexp, 79825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidateCompiledCallback, ctxt); 79835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->perr = 0; 79845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = content; 79855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 79865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = cur; 79875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 79885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 79895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 79905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlIsBlankNode(cur)) 79915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 79925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt); 79935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 79945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, 79955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent->name); 79965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 79975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 79985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 79995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->ns != NULL) { 80005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString2(exec, cur->name, 80015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ns->href, ctxt); 80025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 80035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, cur->name, ctxt); 80045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 80065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name); 80075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 80095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 80105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 80115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 80135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 80145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 80155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Switch to next element 80165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 80175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 80185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, NULL, NULL); 80205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) { 80215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 80225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = NULL; 80235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 0) { 80245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 80255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: get some of the names needed to exit the current state of exec 80265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 80275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); 80285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 80295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 80305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 80315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 80325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 80335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeExecCtxt(exec); 80355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 80365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * There might be content model errors outside of the pure 80375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * regexp validation, e.g. for attribute values. 80385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 80395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (ctxt->perr != 0)) { 80405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->perr; 80415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->perr = oldperr; 80435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 80445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 80455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 80475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 80485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Progressive validation of when possible * 80495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 80505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 80515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 80525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr defines); 80535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, 80545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dolog); 80555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); 80565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 80585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGElemPush: 80595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 80605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @exec: the regexp runtime for the new content model 80615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 80625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push a new regexp for the current node content model on the stack 80635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 80645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error. 80655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 80665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 80675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec) 80685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 80695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemTab == NULL) { 80705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemMax = 10; 80715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax * 80725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 80735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRegExecCtxtPtr)); 80745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemTab == NULL) { 80755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 80765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 80775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemNr >= ctxt->elemMax) { 80805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemMax *= 2; 80815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab, 80825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemMax * 80835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof 80845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRegExecCtxtPtr)); 80855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemTab == NULL) { 80865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 80875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 80885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 80905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemTab[ctxt->elemNr++] = exec; 80915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elem = exec; 80925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 80935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 80945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 80965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGElemPop: 80975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 80985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 80995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop the regexp of the current node content model from the stack 81005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 81015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the exec or NULL if empty 81025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 81035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRegExecCtxtPtr 81045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt) 81055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 81065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr ret; 81075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemNr <= 0) 81095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 81105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemNr--; 81115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->elemTab[ctxt->elemNr]; 81125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elemTab[ctxt->elemNr] = NULL; 81135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemNr > 0) 81145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1]; 81155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 81165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->elem = NULL; 81175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 81185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 81195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 81215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateProgressiveCallback: 81225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @exec: the regular expression instance 81235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @token: the token which matched 81245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @transdata: callback data, the define for the subelement if available 81255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @ @inputdata: callback data, the Relax NG validation context 81265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 81275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle the callback and if needed validate the element children. 81285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * some of the in/out informations are passed via the context in @inputdata. 81295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 81305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 81315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec 81325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ATTRIBUTE_UNUSED, 81335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * token, 81345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *transdata, void *inputdata) 81355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 81365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; 81375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; 81385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state, oldstate; 81395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 81405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, oldflags; 81415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 81435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 81445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Progressive callback for: '%s'\n", token); 81455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 81465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) { 81475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s missing context\n", token); 81485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 81505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = ctxt->pnode; 81515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = 1; 81525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define == NULL) { 81535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (token[0] == '#') 81545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s missing define\n", token); 81565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 81575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 81585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 81595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 81615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (define == NULL)) { 81625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s missing info\n", token); 81635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 81645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 81655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 81665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (define->type != XML_RELAXNG_ELEMENT) { 81685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "callback on %s define is not element\n", token); 81695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNo == XML_RELAXNG_OK) 81705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 81715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 81725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 81745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type != XML_ELEMENT_NODE) { 81755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOTELEM); 81765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 81775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 81785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 81795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 81815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->contModel == NULL) { 81825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 81835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this node cannot be validated in a streamable fashion 81845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 81855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 81865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 81875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Element '%s' validation is not streamable\n", 81885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token); 81895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 81905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = 0; 81915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pdef = define; 81925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 81945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRegNewExecCtxt(define->contModel, 81955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidateProgressiveCallback, ctxt); 81965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exec == NULL) { 81975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 81985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 81995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGElemPush(ctxt, exec); 82015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 82035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the attributes part of the content. 82045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 82055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = xmlRelaxNGNewValidState(ctxt, node); 82065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) { 82075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 82085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 82095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 82115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 82125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->attrs != NULL) { 82135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); 82145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 82155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 82165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); 82175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 82205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = NULL; 82215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 82225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 82235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 82245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 82265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 82275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmp = -1, i; 82285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 82305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 82325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->states->tabState[i]; 82335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 82345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = NULL; 82355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 82375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 0; 82385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 82395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) { 82425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 82435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * validation error, log the message for the "best" one 82445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 82455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 82465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGLogBestError(ctxt); 82475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 82495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); 82505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 82525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 82535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (tmp == -1)) 82545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = -1; 82555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 82565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->pstate == -1) { 82585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 82595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 82605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 82635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 82645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 82665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidatePushElement: 82675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 82685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a document instance 82695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem: an element instance 82705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 82715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push a new element start on the RelaxNG validation stack. 82725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 82735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 1 if no validation problem was found or 0 if validating the 82745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element requires a full node, and -1 in case of error. 82755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 82765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 82775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, 82785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc ATTRIBUTE_UNUSED, 82795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr elem) 82805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 82815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 1; 82825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (elem == NULL)) 82845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 82855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 82875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name); 82885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 82895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elem == 0) { 82905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema; 82915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar; 82925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr exec; 82935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define; 82945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema = ctxt->schema; 82965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) { 82975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 82985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 82995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grammar = schema->topgrammar; 83015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((grammar == NULL) || (grammar->start == NULL)) { 83025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 83035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 83045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define = grammar->start; 83065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->contModel == NULL) { 83075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pdef = define; 83085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 83095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRegNewExecCtxt(define->contModel, 83115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidateProgressiveCallback, 83125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt); 83135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exec == NULL) { 83145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 83155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGElemPush(ctxt, exec); 83175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pnode = elem; 83195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->pstate = 0; 83205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elem->ns != NULL) { 83215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 83225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href, 83235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt); 83245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 83255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt); 83265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 83285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name); 83295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 83305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->pstate == 0) 83315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 83325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ctxt->pstate < 0) 83335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 83345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 83355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 83365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 83385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 83395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", 83405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem->name); 83415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 83425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 83435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 83445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 83465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidatePushCData: 83475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the RelaxNG validation context 83485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: some character data read 83495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the lenght of the data 83505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 83515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check the CData parsed for validation in the current stack 83525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 83535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 1 if no validation problem was found or -1 otherwise 83545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 83555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 83565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, 83575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * data, int len ATTRIBUTE_UNUSED) 83585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 83595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 1; 83605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL)) 83625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 83635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 83655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len); 83665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 83675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*data != 0) { 83695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IS_BLANK_CH(*data)) 83705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 83715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data++; 83725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*data == 0) 83745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 83755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt); 83775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 83785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO "); 83795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 83805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "CDATA failed\n"); 83815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 83825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 83845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 83855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 83865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 83875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 83895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidatePopElement: 83905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the RelaxNG validation context 83915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a document instance 83925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem: an element instance 83935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 83945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop the element end from the RelaxNG validation stack. 83955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 83965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 1 if no validation problem was found or 0 otherwise 83975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 83985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 83995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt, 84005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc ATTRIBUTE_UNUSED, 84015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr elem) 84025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 84035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 84045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr exec; 84055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL)) 84075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 84085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 84095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name); 84105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 84115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 84125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * verify that we reached a terminal state of the content model. 84135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 84145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRelaxNGElemPop(ctxt); 84155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, NULL, NULL); 84165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 84175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 84185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: get some of the names needed to exit the current state of exec 84195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 84205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); 84215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 84225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret < 0) { 84235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 84245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 84255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 84265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 84275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeExecCtxt(exec); 84285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 84295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 84305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n", 84315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem->name); 84325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 84335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 84345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 84355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 84375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateFullElement: 84385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context 84395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a document instance 84405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem: an element instance 84415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 84425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate a full subtree when xmlRelaxNGValidatePushElement() returned 84435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 0 and the content of the node has been expanded. 84445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 84455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 1 if no validation problem was found or -1 in case of error. 84465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 84475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 84485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, 84495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc ATTRIBUTE_UNUSED, 84505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr elem) 84515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 84525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 84535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state; 84545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL)) 84565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 84575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 84585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name); 84595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 84605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = xmlRelaxNGNewValidState(ctxt, elem->parent); 84615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) { 84625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 84635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 84645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->seq = elem; 84655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 84665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_OK; 84675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef); 84685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK)) 84695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 84705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 84715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 84725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 84735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 84745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_PROGRESSIVE 84755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 84765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", 84775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem->name); 84785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 84795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 84805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 84815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 84835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 84845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic interpreted validation implementation * 84855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 84865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 84875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 84885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define); 84895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 84915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSkipIgnored: 84925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a schema validation context 84935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the top node. 84945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 84955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip ignorable nodes in that context 84965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 84975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new sibling or NULL in case of error. 84985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 84995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 85005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 85015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node) 85025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 85035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 85045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO complete and handle entities 85055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((node != NULL) && 85075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((node->type == XML_COMMENT_NODE) || 85085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_PI_NODE) || 85095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_XINCLUDE_START) || 85105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_XINCLUDE_END) || 85115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((node->type == XML_TEXT_NODE) || 85125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE)) && 85135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ctxt->flags & FLAGS_MIXED_CONTENT) || 85145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (IS_BLANK_NODE(node)))))) { 85155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->next; 85165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (node); 85185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 85195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 85215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNormalize: 85225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a schema validation context 85235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str: the string to normalize 85245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the normalizeWhiteSpace( s ) function from 85265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * section 6.2.9 of the spec 85275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new string or NULL in case of error. 85295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar * 85315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str) 85325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 85335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret, *p; 85345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *tmp; 85355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 85365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str == NULL) 85385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 85395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = str; 85405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*tmp != 0) 85415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp++; 85425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = tmp - str; 85435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); 85455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 85465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 85475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 85485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = ret; 85505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*str)) 85515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str++; 85525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*str != 0) { 85535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_BLANK_CH(*str)) { 85545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*str)) 85555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str++; 85565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*str == 0) 85575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 85585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p++ = ' '; 85595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 85605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p++ = *str++; 85615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p = 0; 85635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 85645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 85655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 85675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateDatatype: 85685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 85695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the string value 85705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the datatype definition 85715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node 85725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given value against the dataype 85745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 85765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 85785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt, 85795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * value, 85805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define, xmlNodePtr node) 85815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 85825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret, tmp; 85835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeLibraryPtr lib; 85845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *result = NULL; 85855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur; 85865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define == NULL) || (define->data == NULL)) { 85885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 85895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib = (xmlRelaxNGTypeLibraryPtr) define->data; 85915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib->check != NULL) { 85925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define->attrs != NULL) && 85935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (define->attrs->type == XML_RELAXNG_PARAM)) { 85945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 85955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->check(lib->data, define->name, value, &result, node); 85965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 85975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = lib->check(lib->data, define->name, value, NULL, node); 85985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 86005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 86015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 86025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name); 86035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) 86045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->freef(lib->data, result); 86055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 86065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 1) { 86075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 86085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 2) { 86095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value); 86105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 86115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value); 86125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 86135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 86145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = define->attrs; 86155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) { 86165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lib->facet != NULL) { 86175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = lib->facet(lib->data, define->name, cur->name, 86185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->value, value, result); 86195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 86205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 86215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 86225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 86235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 86245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (define->content != NULL)) { 86255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *oldvalue, *oldendvalue; 86265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 86285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldendvalue = ctxt->state->endvalue; 86295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = (xmlChar *) value; 86305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = NULL; 86315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, define->content); 86325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = (xmlChar *) oldvalue; 86335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = (xmlChar *) oldendvalue; 86345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 86355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) 86365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib->freef(lib->data, result); 86375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 86385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 86395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 86415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNextValue: 86425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 86435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 86445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip to the next value when validating within a list 86455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 86465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the operation succeeded or an error code. 86475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 86485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 86495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) 86505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 86515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *cur; 86525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->state->value; 86545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == NULL) || (ctxt->state->endvalue == NULL)) { 86555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = NULL; 86565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = NULL; 86575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 86585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 86595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*cur != 0) 86605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 86615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((cur != ctxt->state->endvalue) && (*cur == 0)) 86625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 86635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == ctxt->state->endvalue) 86645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = NULL; 86655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 86665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = cur; 86675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 86685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 86695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 86715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateValueList: 86725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 86735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defines: the list of definitions to verify 86745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 86755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given set of definitions for the current value 86765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 86775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 86785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 86795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 86805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, 86815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr defines) 86825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 86835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 86845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (defines != NULL) { 86865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, defines); 86875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 86885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 86895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defines = defines->next; 86905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 86915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 86925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 86935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 86955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateValue: 86965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 86975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to verify 86985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 86995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given definition for the current value 87005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 87015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 87025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 87035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 87045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 87055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define) 87065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 87075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, oldflags; 87085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value; 87095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = ctxt->state->value; 87115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (define->type) { 87125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY:{ 87135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((value != NULL) && (value[0] != 0)) { 87145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx = 0; 87155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(value[idx])) 87175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) idx++; 87185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value[idx] != 0) 87195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 87205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 87225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 87245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 87255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE:{ 87265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(value, define->value)) { 87275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) { 87285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGTypeLibraryPtr lib; 87295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lib = (xmlRelaxNGTypeLibraryPtr) define->data; 87315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((lib != NULL) && (lib->comp != NULL)) { 87325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = lib->comp(lib->data, define->name, 87335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->value, define->node, 87345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) define->attrs, 87355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value, ctxt->state->node); 87365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 87375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 87385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 87395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, 87405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->name); 87415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 87425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 1) { 87435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 87445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 87455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 87465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 87485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *nval, *nvalue; 87495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 87515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: trivial optimizations are possible by 87525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * computing at compile-time 87535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 87545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nval = xmlRelaxNGNormalize(ctxt, define->value); 87555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nvalue = xmlRelaxNGNormalize(ctxt, value); 87565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nval == NULL) || (nvalue == NULL) || 87585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(nval, nvalue))) 87595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 87605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nval != NULL) 87615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(nval); 87625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nvalue != NULL) 87635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(nvalue); 87645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 87675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNextValue(ctxt); 87685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 87695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE:{ 87715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDatatype(ctxt, value, define, 87725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq); 87735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 87745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNextValue(ctxt); 87755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 87775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE:{ 87795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list = define->content; 87805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *oldvalue; 87815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 87835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 87845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 87865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 87875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, list); 87885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 87895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 87905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = oldvalue; 87925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 87935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 87955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 87965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 87975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 87985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 87995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > 0) 88005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, 0); 88015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 88035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST:{ 88055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list = define->content; 88065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *oldvalue, *oldend, *val, *cur; 88075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_LIST 88095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_values = 0; 88105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 88115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 88135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldend = ctxt->state->endvalue; 88145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlStrdup(oldvalue); 88165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val == NULL) { 88175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlStrdup(BAD_CAST ""); 88185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val == NULL) { 88205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 88215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 88225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = val; 88245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*cur != 0) { 88255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_BLANK_CH(*cur)) { 88265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cur = 0; 88275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 88285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_LIST 88295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb_values++; 88305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 88315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*cur)) 88325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cur++ = 0; 88335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 88345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 88355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_LIST 88375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 88385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "list value: '%s' found %d items\n", 88395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue, nb_values); 88405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb_values = 0; 88415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 88425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = cur; 88435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = val; 88445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*cur == 0) && (cur != ctxt->state->endvalue)) 88455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 88465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = cur; 88485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 88505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state->value == ctxt->state->endvalue) 88515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = NULL; 88525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, list); 88535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 88545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_LIST 88555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 88565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to validate value: '%s' with %d rule\n", 88575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value, nb_values); 88585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 88595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 88605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_LIST 88625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb_values++; 88635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 88645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 88655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (ctxt->state->value != NULL) && 88685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->state->value != ctxt->state->endvalue)) { 88695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, 88705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value); 88715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 88725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(val); 88745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = oldvalue; 88755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = oldend; 88765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 88775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 88795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValueList(ctxt, define->content); 88805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 88815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 88825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 88835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* no break on purpose */ 88845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE:{ 88855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *cur, *temp; 88865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 88885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 88895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->state->value; 88905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp = NULL; 88915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((cur != NULL) && (cur != ctxt->state->endvalue) && 88925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (temp != cur)) { 88935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp = cur; 88945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 88955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidateValueList(ctxt, define->content); 88965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 88975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = temp; 88985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 88995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->state->value; 89025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 89045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > 0) 89055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, 0); 89065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT:{ 89095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 89105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = define->content; 89125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 89135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, list); 89145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 89155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 89165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 89185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 89195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 89205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 89245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP:{ 89255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 89265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = define->content; 89285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 89295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, list); 89305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 89315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 89325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 89345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 89355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 89365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 89405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 89415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->content == NULL) { 89425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NODEFINE); 89435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 89445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 89455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, define->content); 89465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 89495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO ret = -1; 89505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 89525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 89535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 89555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateValueContent: 89565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 89575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @defines: the list of definitions to verify 89585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 89595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given definitions for the current value 89605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 89615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 89625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 89635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 89645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt, 89655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr defines) 89665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 89675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 89685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (defines != NULL) { 89705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, defines); 89715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 89725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 89735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defines = defines->next; 89745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 89765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 89775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 89795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGAttributeMatch: 89805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 89815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to check 89825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prop: the attribute 89835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 89845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the attribute matches the definition nameClass 89855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 89865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the attribute matches, 0 if no, or -1 in case of error 89875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 89885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 89895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, 89905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define, xmlAttrPtr prop) 89915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 89925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 89935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) { 89955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(define->name, prop->name)) 89965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 89975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 89985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->ns != NULL) { 89995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->ns[0] == 0) { 90005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop->ns != NULL) 90015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 90025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 90035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((prop->ns == NULL) || 90045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(define->ns, prop->ns->href))) 90055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 90065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->nameClass == NULL) 90095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 90105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define = define->nameClass; 90115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->type == XML_RELAXNG_EXCEPT) { 90125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 90135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = define->content; 90155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 90165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); 90175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 90185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 90195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 90205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 90215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 90225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 90245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO} 90255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 90265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 90275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 90295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateAttribute: 90305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 90315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to verify 90325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 90335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given attribute definition for that node 90345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 90355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 90365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 90375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 90385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt, 90395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define) 90405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 90415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, i; 90425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value, *oldvalue; 90435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr prop = NULL, tmp; 90445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldseq; 90455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state->nbAttrLeft <= 0) 90475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 90485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) { 90495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->state->nbAttrs; i++) { 90505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = ctxt->state->attrs[i]; 90515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) { 90525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((((define->ns == NULL) || (define->ns[0] == 0)) && 90535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (tmp->ns == NULL)) || 90545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((tmp->ns != NULL) && 90555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(define->ns, tmp->ns->href)))) { 90565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = tmp; 90575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 90585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 90625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlNodeListGetString(prop->doc, prop->children, 1); 90635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 90645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldseq = ctxt->state->seq; 90655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = (xmlNodePtr) prop; 90665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = value; 90675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = NULL; 90685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValueContent(ctxt, define->content); 90695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state->value != NULL) 90705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = ctxt->state->value; 90715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) 90725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 90735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = oldvalue; 90745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = oldseq; 90755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 90765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 90775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flag the attribute as processed 90785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 90795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->attrs[i] = NULL; 90805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->nbAttrLeft--; 90815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 90835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 90845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 90865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 90875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGValidateAttribute(%s): %d\n", 90885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->name, ret); 90895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 90905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 90915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->state->nbAttrs; i++) { 90925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = ctxt->state->attrs[i]; 90935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp != NULL) && 90945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) { 90955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = tmp; 90965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 90975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 91005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlNodeListGetString(prop->doc, prop->children, 1); 91015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 91025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldseq = ctxt->state->seq; 91035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = (xmlNodePtr) prop; 91045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = value; 91055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValueContent(ctxt, define->content); 91065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state->value != NULL) 91075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = ctxt->state->value; 91085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) 91095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 91105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = oldvalue; 91115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = oldseq; 91125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 91135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 91145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flag the attribute as processed 91155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 91165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->attrs[i] = NULL; 91175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->nbAttrLeft--; 91185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 91205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 91215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 91235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->ns != NULL) { 91245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 91255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n", 91265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->ns, ret); 91275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 91285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 91295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGValidateAttribute(anyName): %d\n", 91305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret); 91315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 91335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 91365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 91375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 91395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateAttributeList: 91405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 91415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the list of definition to verify 91425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 91435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given node against the list of attribute definitions 91445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 91455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 91465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 91475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 91485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 91495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr defines) 91505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 91515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, res; 91525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int needmore = 0; 91535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur; 91545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = defines; 91565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 91575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_RELAXNG_ATTRIBUTE) { 91585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0) 91595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 91605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 91615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needmore = 1; 91625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 91635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!needmore) 91655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 91665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = defines; 91675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 91685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type != XML_RELAXNG_ATTRIBUTE) { 91695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) || (ctxt->states != NULL)) { 91705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlRelaxNGValidateDefinition(ctxt, cur); 91715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res < 0) 91725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 91735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 91745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 91755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 91765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == -1) /* continues on -2 */ 91785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 91795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 91815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 91825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 91845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 91855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 91875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNodeMatchesList: 91885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node 91895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: a NULL terminated array of definitions 91905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 91915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if a node can be matched by one of the definitions 91925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 91935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if matches 0 otherwise 91945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 91955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 91965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list) 91975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 91985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr cur; 91995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0, tmp; 92005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node == NULL) || (list == NULL)) 92025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 92035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list[i++]; 92055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 92065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_ELEMENT_NODE) && 92075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_ELEMENT)) { 92085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGElementMatch(NULL, cur, node); 92095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == 1) 92105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 92115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (((node->type == XML_TEXT_NODE) || 92125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE)) && 92135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_RELAXNG_TEXT)) { 92145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 92155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list[i++]; 92175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 92195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 92205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 92225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateInterleave: 92235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 92245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to verify 92255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 92265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate an interleave definition for a node. 92275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 92285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 92295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 92305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 92315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, 92325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define) 92335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 92345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, i, nbgroups; 92355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int errNr = ctxt->errNr; 92365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldflags; 92375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr oldstate; 92395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPartitionPtr partitions; 92405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGInterleaveGroupPtr group = NULL; 92415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem; 92425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr *list = NULL, *lasts = NULL; 92435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->data != NULL) { 92455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions = (xmlRelaxNGPartitionPtr) define->data; 92465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbgroups = partitions->nbgroups; 92475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 92485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_INTERNODATA); 92495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 92505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 92525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Optimizations for MIXED 92535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 92545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 92555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->dflags & IS_MIXED) { 92565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_MIXED_CONTENT; 92575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbgroups == 2) { 92585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 92595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this is a pure <mixed> case 92605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 92615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) 92625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, 92635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq); 92645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT) 92655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, 92665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->groups[1]-> 92675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule); 92685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 92695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, 92705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partitions->groups[0]-> 92715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule); 92725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 92735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) 92745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, 92755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state-> 92765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seq); 92775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 92795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 92805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 92845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build arrays to store the first and last node of the chain 92855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pertaining to each group 92865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 92875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); 92885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) { 92895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 92905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 92915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(list, 0, nbgroups * sizeof(xmlNodePtr)); 92935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); 92945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lasts == NULL) { 92955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 92965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 92975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 92985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(lasts, 0, nbgroups * sizeof(xmlNodePtr)); 92995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 93015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Walk the sequence of children finding the right group and 93025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sorting them in sequences. 93035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 93045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->state->seq; 93055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGSkipIgnored(ctxt, cur); 93065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = cur; 93075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 93085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = cur; 93095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((partitions->triage != NULL) && 93105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (partitions->flags & IS_DETERMINIST)) { 93115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *tmp = NULL; 93125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_TEXT_NODE) || 93145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_CDATA_SECTION_NODE)) { 93155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text", 93165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 93175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_ELEMENT_NODE) { 93185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->ns != NULL) { 93195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlHashLookup2(partitions->triage, cur->name, 93205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ns->href); 93215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) 93225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlHashLookup2(partitions->triage, 93235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "#any", 93245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ns->href); 93255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 93265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 93275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(partitions->triage, cur->name, 93285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 93295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) 93305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 93315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(partitions->triage, BAD_CAST "#any", 93325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 93335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 93365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = nbgroups; 93375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 93385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = ((long) tmp) - 1; 93395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partitions->flags & IS_NEEDCHECK) { 93405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = partitions->groups[i]; 93415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) 93425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = nbgroups; 93435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 93465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbgroups; i++) { 93475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = partitions->groups[i]; 93485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group == NULL) 93495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 93505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGNodeMatchesList(cur, group->defs)) 93515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 93525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 93555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We break as soon as an element not matched is found 93565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 93575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i >= nbgroups) { 93585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 93595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lasts[i] != NULL) { 93615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lasts[i]->next = cur; 93625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lasts[i] = cur; 93635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 93645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[i] = cur; 93655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lasts[i] = cur; 93665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) 93685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastchg = cur->next; 93695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 93705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastchg = cur; 93715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGSkipIgnored(ctxt, cur->next); 93725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 93745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 93755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 93765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 93775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastelem = cur; 93795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 93805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbgroups; i++) { 93815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); 93825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = partitions->groups[i]; 93835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lasts[i] != NULL) { 93845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = lasts[i]->next; 93855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lasts[i]->next = NULL; 93865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = list[i]; 93885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); 93895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 93905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 93915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 93925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->state->seq; 93935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGSkipIgnored(ctxt, cur); 93945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, oldstate); 93955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 93965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 93975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) { 93985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); 93995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 94005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 94015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 94025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 94045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 94055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int found = 0; 94065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int best = -1; 94075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lowattr = -1; 94085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 94105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PBM: what happen if there is attributes checks in the interleaves 94115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 94125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < ctxt->states->nbState; j++) { 94145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->states->tabState[j]->seq; 94155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlRelaxNGSkipIgnored(ctxt, cur); 94165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) { 94175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == 0) { 94185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lowattr = ctxt->states->tabState[j]->nbAttrLeft; 94195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = j; 94205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = 1; 94225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { 94235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* try to keep the latest one to mach old heuristic */ 94245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lowattr = ctxt->states->tabState[j]->nbAttrLeft; 94255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = j; 94265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lowattr == 0) 94285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 94295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (found == 0) { 94305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lowattr == -1) { 94315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lowattr = ctxt->states->tabState[j]->nbAttrLeft; 94325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = j; 94335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 94345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { 94355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* try to keep the latest one to mach old heuristic */ 94365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lowattr = ctxt->states->tabState[j]->nbAttrLeft; 94375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = j; 94385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 94425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BIG PBM: here we pick only one restarting point :-( 94435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 94445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states->nbState > 0) { 94455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, oldstate); 94465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (best != -1) { 94475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->states->tabState[best]; 94485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[best] = NULL; 94495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 94505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = 94515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[ctxt->states->nbState - 1]; 94525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[ctxt->states->nbState - 1] = NULL; 94535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->nbState--; 94545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < ctxt->states->nbState ; j++) { 94575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]); 94585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 94605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 94615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == 0) { 94625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) { 94635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, 94645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "noname"); 94655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 94665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); 94675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 94695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 94705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 94715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 94735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 94745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 94755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lasts[i] != NULL) { 94775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lasts[i]->next = last; 94785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) 94815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 94825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 94835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = lastelem; 94845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 94855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 94865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 94875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 94885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 94895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done: 94915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 94925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 94935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * builds the next links chain from the prev one 94945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 94955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = lastchg; 94965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 94975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == start) || (cur->prev == NULL)) 94985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 94995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prev->next = cur; 95005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->prev; 95015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 95035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 95045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 95055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(list); 95085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(lasts); 95095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 95105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 95115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 95135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateDefinitionList: 95145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 95155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the list of definition to verify 95165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given node content against the (list) of definitions 95185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 95205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 95215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 95225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt, 95235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr defines) 95245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 95255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, res; 95265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (defines == NULL) { 95295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_INTERNAL, 95305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "NULL definition list"); 95315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 95325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (defines != NULL) { 95345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) || (ctxt->states != NULL)) { 95355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlRelaxNGValidateDefinition(ctxt, defines); 95365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res < 0) 95375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 95385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 95395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 95405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 95415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == -1) /* continues on -2 */ 95435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 95445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defines = defines->next; 95455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 95485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 95495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 95515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGElementMatch: 95525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 95535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to check 95545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem: the element 95555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the element matches the definition nameClass 95575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the element matches, 0 if no, or -1 in case of error 95595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 95605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 95615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 95625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define, xmlNodePtr elem) 95635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 95645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, oldflags = 0; 95655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) { 95675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(elem->name, define->name)) { 95685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name); 95695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 95705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define->ns != NULL) && (define->ns[0] != 0)) { 95735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elem->ns == NULL) { 95745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name); 95755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 95765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!xmlStrEqual(elem->ns->href, define->ns)) { 95775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS, 95785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem->name, define->ns); 95795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 95805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((elem->ns != NULL) && (define->ns != NULL) && 95825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (define->name == NULL)) { 95835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name); 95845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 95855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((elem->ns != NULL) && (define->name != NULL)) { 95865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name); 95875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 95885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->nameClass == NULL) 95915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 95925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define = define->nameClass; 95945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->type == XML_RELAXNG_EXCEPT) { 95955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 95965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 95985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 95995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 96005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = define->content; 96035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 96045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGElementMatch(ctxt, list, elem); 96055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) { 96065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) 96075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 96085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 96095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 96115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) 96125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 96135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 96145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 96165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 1; 96185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 96195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 96205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (define->type == XML_RELAXNG_CHOICE) { 96225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list; 96235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 96255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 96265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 96275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = define->nameClass; 96305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 96315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGElementMatch(ctxt, list, elem); 96325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) { 96335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) 96345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 96355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 96365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 96385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) 96395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 96405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 96415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 96435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 96455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 96465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 96475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 96485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 96495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > 0) 96505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, 0); 96515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 96545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) { 96555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 96565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 96585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO ret = -1; 96595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 96615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 96625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 96645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGBestState: 96655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 96665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 96675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find the "best" state in the ctxt->states list of states to report 96685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errors about. I.e. a state with no element left in the child list 96695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the one with the less attributes left. 96705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is called only if a falidation error was detected 96715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 96725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the index of the "best" state or -1 in case of error 96735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 96745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 96755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt) 96765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 96775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state; 96785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, tmp; 96795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int best = -1; 96805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value = 1000000; 96815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->states == NULL) || 96835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->states->nbState <= 0)) 96845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 96855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 96875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->states->tabState[i]; 96885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) 96895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 96905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state->seq != NULL) { 96915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((best == -1) || (value > 100000)) { 96925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = 100000; 96935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = i; 96945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 96955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 96965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = state->nbAttrLeft; 96975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((best == -1) || (value > tmp)) { 96985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = tmp; 96995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = i; 97005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (best); 97045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 97055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 97075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGLogBestError: 97085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 97095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 97105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find the "best" state in the ctxt->states list of states to report 97115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errors about and log it. 97125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 97135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 97145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt) 97155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 97165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int best; 97175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->states == NULL) || 97195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->states->nbState <= 0)) 97205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 97215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) best = xmlRelaxNGBestState(ctxt); 97235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((best >= 0) && (best < ctxt->states->nbState)) { 97245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = ctxt->states->tabState[best]; 97255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidateElementEnd(ctxt, 1); 97275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 97295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 97315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateElementEnd: 97325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 97335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dolog: indicate that error logging should be done 97345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 97355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the end of the element, implements check that 97365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * there is nothing left not consumed in the element content 97375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or in the attribute list. 97385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 97395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 97405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 97415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 97425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog) 97435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 97445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 97455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state; 97465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->state; 97485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state->seq != NULL) { 97495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq); 97505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state->seq != NULL) { 97515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dolog) { 97525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT, 97535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->node->name, state->seq->name); 97545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 97565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < state->nbAttrs; i++) { 97595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state->attrs[i] != NULL) { 97605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dolog) { 97615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR, 97625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->attrs[i]->name, state->node->name); 97635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1 - i); 97655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 97685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 97695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 97715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateState: 97725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 97735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to verify 97745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 97755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the current state against the definition 97765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 97775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 97785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 97795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 97805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt, 97815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define) 97825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 97835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 97845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0, i, tmp, oldflags, errNr; 97855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr oldstate = NULL, state; 97865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define == NULL) { 97885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NODEFINE); 97895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 97905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 97935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = ctxt->state->seq; 97945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 97955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = NULL; 97965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 97975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 97985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->depth; i++) 97995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, " "); 98005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 98015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Start validating %s ", xmlRelaxNGDefName(define)); 98025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) 98035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "%s ", define->name); 98045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node != NULL) && (node->name != NULL)) 98055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name); 98065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 98075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "\n"); 98085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 98095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->depth++; 98105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (define->type) { 98115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EMPTY: 98125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlRelaxNGSkipIgnored(ctxt, node); 98135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 98145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOT_ALLOWED: 98165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 98175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_TEXT: 98195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((node != NULL) && 98205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((node->type == XML_TEXT_NODE) || 98215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_COMMENT_NODE) || 98225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_PI_NODE) || 98235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE))) 98245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->next; 98255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = node; 98265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ELEMENT: 98285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errNr = ctxt->errNr; 98295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlRelaxNGSkipIgnored(ctxt, node); 98305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) { 98315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name); 98325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 98335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 98345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 98355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type != XML_ELEMENT_NODE) { 98385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOTELEM); 98395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 98405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 98415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 98425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 98455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This node was already validated successfully against 98465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this definition. 98475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 98485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->psvi == define) { 98495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); 98505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 98515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 98525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr != 0) { 98535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((ctxt->err != NULL) && 98545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) 98555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (xmlStrEqual(ctxt->err->arg2, node->name))) 98565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || 98575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ctxt->err->err == 98585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ERR_ELEMEXTRANS) 98595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (xmlStrEqual(ctxt->err->arg1, node->name))) 98605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) 98615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (ctxt->err->err == 98625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_RELAXNG_ERR_NOTELEM))) 98635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPop(ctxt); 98645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGElementMatch(ctxt, define, node); 98695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret <= 0) { 98705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 98715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 98725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 98735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 98745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 98765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr != 0) { 98775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 98785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 98795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((ctxt->err != NULL) && 98805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && 98815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(ctxt->err->arg2, node->name))) || 98825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && 98835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(ctxt->err->arg1, node->name))) || 98845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || 98855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) 98865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidErrorPop(ctxt); 98875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errNr = ctxt->errNr; 98895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 98915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->flags & FLAGS_MIXED_CONTENT) { 98925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags -= FLAGS_MIXED_CONTENT; 98935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 98945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = xmlRelaxNGNewValidState(ctxt, node); 98955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == NULL) { 98965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 98975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 98985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 98995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 99005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = ctxt->state; 99035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 99045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->attrs != NULL) { 99055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); 99065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) { 99075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 99085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); 99095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->contModel != NULL) { 99125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state; 99135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr tmpstates = ctxt->states; 99145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr nseq; 99155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nstate = xmlRelaxNGNewValidState(ctxt, node); 99175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = nstate; 99185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 99195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGValidateCompiledContent(ctxt, 99215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->contModel, 99225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq); 99235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nseq = ctxt->state->seq; 99245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = tmpstate; 99255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = tmpstates; 99265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, nstate); 99275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_COMPILE 99295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 99305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Validating content of '%s' : %d\n", 99315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->name, tmp); 99325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 99335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) 99345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 99355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) { 99375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = -1; 99385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 99405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->states->tabState[i]; 99415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 99425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = nseq; 99435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 99455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 0; 99465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 99475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) { 99505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 99515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * validation error, log the message for the "best" one 99525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 99535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 99545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGLogBestError(ctxt); 99555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 99575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, 99585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states-> 99595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabState[i]); 99605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 99625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 99635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 99645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (tmp == -1)) 99655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 99665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 99675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->state; 99685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) 99695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = nseq; 99705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 99715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 99725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, state); 99735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 99755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->content != NULL) { 99765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGValidateDefinitionList(ctxt, 99775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define-> 99785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content); 99795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) { 99805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 99815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state == NULL) { 99825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 99835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, 99845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->name); 99855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 99865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 99875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, 99885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->name); 99895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 99935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) { 99945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = -1; 99955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 99975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->states->tabState[i]; 99985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 99995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 100015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 0; 100025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 100035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != 0) { 100065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 100075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * validation error, log the message for the "best" one 100085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 100095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 100105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGLogBestError(ctxt); 100115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 100135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, 100145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[i]); 100155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[i] = NULL; 100165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 100185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 100195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 100205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (tmp == -1)) 100215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 100225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 100235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->state; 100245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 100255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 100265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, state); 100275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 100305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->psvi = define; 100315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 100335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 100345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldstate != NULL) 100355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); 100365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 100375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 100385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 100395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 100405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 100415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 100425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -2; 100435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 100445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 100465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 100475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 100485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 100515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 100525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlRelaxNGValidateDefinition(): validated %s : %d", 100535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->name, ret); 100545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldstate == NULL) 100555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, ": no state\n"); 100565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (oldstate->seq == NULL) 100575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, ": done\n"); 100585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (oldstate->seq->type == XML_ELEMENT_NODE) 100595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, ": next elem %s\n", 100605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate->seq->name); 100615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 100625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, ": next %s %d\n", 100635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate->seq->name, oldstate->seq->type); 100645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 100655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 100665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_OPTIONAL:{ 100675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errNr = ctxt->errNr; 100685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 100695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 100705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); 100715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 100725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidateDefinitionList(ctxt, 100735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define->content); 100745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 100755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) 100765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 100775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 100785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 100795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 100805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 100815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 100825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 100835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) { 100855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); 100865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 100875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = xmlRelaxNGNewStates(ctxt, 1); 100885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states == NULL) { 100895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, oldstate); 100905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 100915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 100925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 100935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 100945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 100955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); 100975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state); 100985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 100995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 101015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 101025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 101035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 101045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 101055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ONEORMORE: 101075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errNr = ctxt->errNr; 101085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); 101095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 101105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 101115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 101135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 101145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* no break on purpose */ 101155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ZEROORMORE:{ 101165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int progress; 101175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states = NULL, res = NULL; 101185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int base, j; 101195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errNr = ctxt->errNr; 101215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlRelaxNGNewStates(ctxt, 1); 101225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) { 101235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 101245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 101255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 101275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All the input states are also exit states 101285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 101295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 101305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, res, 101315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCopyValidState(ctxt, 101325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt-> 101335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state)); 101345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 101355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < ctxt->states->nbState; j++) { 101365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, res, 101375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCopyValidState(ctxt, 101385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[j])); 101395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 101425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 101435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 101445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress = 0; 101455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = res->nbState; 101465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) { 101485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states = ctxt->states; 101495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < states->nbState; i++) { 101505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = states->tabState[i]; 101515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 101525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinitionList(ctxt, 101535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define-> 101545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content); 101555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 101565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 101575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGAddStates(ctxt, res, 101585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state); 101595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 101605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == 1) 101615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress = 1; 101625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 101635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < ctxt->states->nbState; 101645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j++) { 101655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 101665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, res, 101675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[j]); 101685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == 1) 101695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress = 1; 101705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, 101725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states); 101735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 101745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 101765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 101775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, 101785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state); 101795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 101805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 101835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 101845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinitionList(ctxt, 101855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) define-> 101865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content); 101875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 101885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 101895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 101905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 101915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = res->nbState; 101925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 101935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGAddStates(ctxt, res, 101945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state); 101955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 101965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == 1) 101975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress = 1; 101985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 101995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < ctxt->states->nbState; j++) { 102005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlRelaxNGAddStates(ctxt, res, 102015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[j]); 102025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == 1) 102035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress = 1; 102045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states == NULL) { 102065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states = ctxt->states; 102075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 102085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, 102095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states); 102105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 102125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (progress) { 102165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 102175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Collect all the new nodes added at that step 102185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and make them the new node set 102195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 102205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->nbState - base == 1) { 102215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = xmlRelaxNGCopyValidState(ctxt, 102225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res-> 102235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabState 102245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [base]); 102255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 102265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states == NULL) { 102275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGNewStates(ctxt, 102285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->nbState - base); 102295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states = ctxt->states; 102305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states == NULL) { 102315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress = 0; 102325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 102335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->nbState = 0; 102365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = base; i < res->nbState; i++) 102375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, states, 102385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCopyValidState 102395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt, res->tabState[i])); 102405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = states; 102415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (progress == 1); 102445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states != NULL) { 102455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, states); 102465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = res; 102485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 102495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 102505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 102515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errors may have to be propagated back... 102525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 102535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 102545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 102555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 102565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 102575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 102585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 102595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_CHOICE:{ 102605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr list = NULL; 102615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states = NULL; 102625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlRelaxNGSkipIgnored(ctxt, node); 102645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errNr = ctxt->errNr; 102665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((define->dflags & IS_TRIABLE) && (define->data != NULL) && 102675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node != NULL)) { 102685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 102695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * node == NULL can't be optimized since IS_TRIABLE 102705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * doesn't account for choice which may lead to 102715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * only attributes. 102725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 102735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashTablePtr triage = 102745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashTablePtr) define->data; 102755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 102775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Something we can optimize cleanly there is only one 102785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * possble branch out ! 102795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 102805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_TEXT_NODE) || 102815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE)) { 102825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = 102835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(triage, BAD_CAST "#text", NULL); 102845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (node->type == XML_ELEMENT_NODE) { 102855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns != NULL) { 102865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = xmlHashLookup2(triage, node->name, 102875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->ns->href); 102885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) 102895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = 102905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(triage, BAD_CAST "#any", 102915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->ns->href); 102925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 102935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = 102945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(triage, node->name, NULL); 102955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) 102965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = 102975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(triage, BAD_CAST "#any", 102985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 102995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) { 103015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 103025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name); 103035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, list); 103065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 103075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = define->content; 103125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 103135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 103145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 103165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); 103175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, list); 103185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 103195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states == NULL) { 103205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states = xmlRelaxNGNewStates(ctxt, 1); 103215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 103235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, states, ctxt->state); 103245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 103255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 103265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, states, 103275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states-> 103285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabState[i]); 103295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 103315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 103325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 103345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 103355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = oldstate; 103375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 103385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states != NULL) { 103405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, oldstate); 103415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = states; 103425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 103435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 103445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 103455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 103465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 103485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 103495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 103505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 103515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 103535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errNr > errNr) 103545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPopErrors(ctxt, errNr); 103555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DEF: 103595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_GROUP: 103605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); 103615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_INTERLEAVE: 103635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateInterleave(ctxt, define); 103645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_ATTRIBUTE: 103665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateAttribute(ctxt, define); 103675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_START: 103695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_NOOP: 103705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_REF: 103715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXTERNALREF: 103725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARENTREF: 103735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, define->content); 103745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_DATATYPE:{ 103765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 103775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *content = NULL; 103785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node; 103805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 103815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child->type == XML_ELEMENT_NODE) { 103825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_DATAELEM, 103835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->parent->name); 103845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 103855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((child->type == XML_TEXT_NODE) || 103875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (child->type == XML_CDATA_SECTION_NODE)) { 103885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlStrcat(content, child->content); 103895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle entities ... */ 103915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 103925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) { 103945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) 103955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(content); 103965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 103975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 103985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 103995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlStrdup(BAD_CAST ""); 104005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 104015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 104025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 104035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDatatype(ctxt, content, define, 104075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq); 104085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) { 104095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name); 104105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 0) { 104115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = NULL; 104125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) 104145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(content); 104155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_VALUE:{ 104185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *content = NULL; 104195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *oldvalue; 104205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 104215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node; 104235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 104245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child->type == XML_ELEMENT_NODE) { 104255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_VALELEM, 104265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->parent->name); 104275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 104285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((child->type == XML_TEXT_NODE) || 104305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (child->type == XML_CDATA_SECTION_NODE)) { 104315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlStrcat(content, child->content); 104325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle entities ... */ 104345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 104355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) { 104375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) 104385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(content); 104395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 104425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlStrdup(BAD_CAST ""); 104435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 104445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 104455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 104465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 104505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = content; 104515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, define); 104525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = oldvalue; 104535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) { 104545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name); 104555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret == 0) { 104565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = NULL; 104575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) 104595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(content); 104605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_LIST:{ 104635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *content; 104645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 104655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *oldvalue, *oldendvalue; 104665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 104675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 104695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make sure it's only text nodes 104705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 104715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = NULL; 104735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = node; 104745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 104755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child->type == XML_ELEMENT_NODE) { 104765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR2(XML_RELAXNG_ERR_LISTELEM, 104775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->parent->name); 104785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 104795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((child->type == XML_TEXT_NODE) || 104815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (child->type == XML_CDATA_SECTION_NODE)) { 104825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlStrcat(content, child->content); 104835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle entities ... */ 104855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 104865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) { 104885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) 104895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(content); 104905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 104935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlStrdup(BAD_CAST ""); 104945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 104955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(ctxt, "validating\n"); 104965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 104975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 104985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 104995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(content); 105015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldvalue = ctxt->state->value; 105025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldendvalue = ctxt->state->endvalue; 105035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = content; 105045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = content + len; 105055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateValue(ctxt, define); 105065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->value = oldvalue; 105075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->endvalue = oldendvalue; 105085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) { 105095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_LIST); 105105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((ret == 0) && (node != NULL)) { 105115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state->seq = node->next; 105125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) 105145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(content); 105155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 105165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_EXCEPT: 105185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_RELAXNG_PARAM: 105195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO ret = -1; 105205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 105215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->depth--; 105235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 105245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->depth; i++) 105255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, " "); 105265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 105275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Validating %s ", xmlRelaxNGDefName(define)); 105285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (define->name != NULL) 105295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "%s ", define->name); 105305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 105315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "suceeded\n"); 105325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 105335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "failed\n"); 105345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 105355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 105365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 105375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 105395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateDefinition: 105405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 105415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @define: the definition to verify 105425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the current node lists against the definition 105445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 105465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 105485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 105495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDefinePtr define) 105505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 105515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGStatesPtr states, res; 105525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, k, ret, oldflags; 105535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 105555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We should NOT have both ctxt->state and ctxt->states 105565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 105585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 105595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 105605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) { 105635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) { 105645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = ctxt->states->tabState[0]; 105655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 105665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 105675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateState(ctxt, define); 105695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 105705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 105715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 105725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) { 105745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = ctxt->states->tabState[0]; 105755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 105765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 105775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 105795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states = ctxt->states; 105825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 105835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = NULL; 105845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = 0; 105855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldflags = ctxt->flags; 105865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags |= FLAGS_IGNORABLE; 105875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < states->nbState; i++) { 105885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = states->tabState[i]; 105895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 105905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateState(ctxt, define); 105915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 105925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We should NOT have both ctxt->state and ctxt->states 105935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 105955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 105965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 105975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 105995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states == NULL) { 106005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 106015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* add the state to the container */ 106025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, res, ctxt->state); 106035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 106045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 106055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* add the state directly in states */ 106065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->tabState[j++] = ctxt->state; 106075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 106085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 106105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) { 106115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* make it the new container and copy other results */ 106125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ctxt->states; 106135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 106145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (k = 0; k < j; k++) 106155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, res, 106165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->tabState[k]); 106175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 106185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* add all the new results to res and reff the container */ 106195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (k = 0; k < ctxt->states->nbState; k++) 106205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGAddStates(ctxt, res, 106215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[k]); 106225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 106235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 106245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 106275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 106285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 106295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 106305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 106315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (k = 0; k < ctxt->states->nbState; k++) 106325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, 106335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states->tabState[k]); 106345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 106355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 106365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->flags = oldflags; 106405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 106415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, states); 106425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = res; 106435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 106445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (j > 1) { 106455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states->nbState = j; 106465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = states; 106475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 106485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (j == 1) { 106495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = states->tabState[0]; 106505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, states); 106515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 106525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 106535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 106545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, states); 106555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) { 106565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(ctxt, ctxt->states); 106575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->states = NULL; 106585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 106615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 106625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 106635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 106655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 106665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 106685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateDocument: 106695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 106705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document 106715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 106725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the given document 106735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 106745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the validation succeeded or an error code. 106755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 106765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 106775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) 106785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 106795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 106805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr schema; 106815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGGrammarPtr grammar; 106825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidStatePtr state; 106835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 106845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL)) 106865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 106875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNo = XML_RELAXNG_OK; 106895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema = ctxt->schema; 106905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grammar = schema->topgrammar; 106915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grammar == NULL) { 106925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 106935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 106945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = xmlRelaxNGNewValidState(ctxt, NULL); 106965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = state; 106975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start); 106985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->state != NULL) && (state->seq != NULL)) { 106995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->state; 107005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = state->seq; 107015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlRelaxNGSkipIgnored(ctxt, node); 107025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node != NULL) { 107035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != -1) { 107045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); 107055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 107065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->states != NULL) { 107095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 107105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmp = -1; 107115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->states->nbState; i++) { 107135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = ctxt->states->tabState[i]; 107145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = state->seq; 107155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlRelaxNGSkipIgnored(ctxt, node); 107165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) 107175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 0; 107185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, state); 107195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == -1) { 107215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != -1) { 107225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); 107235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 107245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state != NULL) { 107285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(ctxt, ctxt->state); 107295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = NULL; 107305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) 107325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 107335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 107345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ctxt->errNr != 0) { 107355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->error(ctxt->userData, 107365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%d Extra error messages left on stack !\n", 107375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->errNr); 107385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGDumpValidError(ctxt); 107395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 107415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED 107425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->idref == 1) { 107435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlValidCtxt vctxt; 107445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&vctxt, 0, sizeof(xmlValidCtxt)); 107465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vctxt.valid = 1; 107475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vctxt.error = ctxt->error; 107485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vctxt.warning = ctxt->warning; 107495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vctxt.userData = ctxt->userData; 107505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateDocumentFinal(&vctxt, doc) != 1) 107525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 107535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */ 107555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK)) 107565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 107575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 107595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 107605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 107625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGCleanPSVI: 107635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: an input element or document 107645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 107655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Call this routine to speed up XPath computation on static documents. 107665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This stamps all the element nodes with the document order 107675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Like for line information, the order is kept in the element->content 107685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * field, the value stored is actually - the node number (starting at -1) 107695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to be able to differentiate from line numbers. 107705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 107715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of elements found in the document or -1 in case 107725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of error. 107735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 107745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 107755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGCleanPSVI(xmlNodePtr node) { 107765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 107775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node == NULL) || 107795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((node->type != XML_ELEMENT_NODE) && 107805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_DOCUMENT_NODE) && 107815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_HTML_DOCUMENT_NODE))) 107825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 107835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ELEMENT_NODE) 107845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->psvi = NULL; 107855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->children; 107875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 107885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_ELEMENT_NODE) { 107895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->psvi = NULL; 107905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children != NULL) { 107915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->children; 107925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 107935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 107965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 107975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 107985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 107995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 108005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 108015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 108025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 108035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == node) { 108045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = NULL; 108055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 108065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 108085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 108095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 108105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 108125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 108145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 108155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 108165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 108175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validation interfaces * 108185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 108195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 108205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 108225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGNewValidCtxt: 108235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a precompiled XML RelaxNGs 108245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 108255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML RelaxNGs validation context based on the given schema 108265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 108275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the validation context or NULL in case of error 108285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 108295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidCtxtPtr 108305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) 108315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 108325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidCtxtPtr ret; 108335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt)); 108355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 108365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRngVErrMemory(NULL, "building context\n"); 108375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 108385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlRelaxNGValidCtxt)); 108405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->schema = schema; 108415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->error = xmlGenericError; 108425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->userData = xmlGenericErrorContext; 108435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->errNr = 0; 108445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->errMax = 0; 108455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->err = NULL; 108465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->errTab = NULL; 108475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema != NULL) 108485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->idref = schema->idref; 108495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->states = NULL; 108505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->freeState = NULL; 108515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->freeStates = NULL; 108525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->errNo = XML_RELAXNG_OK; 108535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 108545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 108555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 108575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGFreeValidCtxt: 108585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema validation context 108595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 108605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the resources associated to the schema validation context 108615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 108625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 108635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) 108645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 108655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int k; 108665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 108685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 108695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->states != NULL) 108705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(NULL, ctxt->states); 108715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->freeState != NULL) { 108725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (k = 0; k < ctxt->freeState->nbState; k++) { 108735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]); 108745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(NULL, ctxt->freeState); 108765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->freeStates != NULL) { 108785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (k = 0; k < ctxt->freeStatesNr; k++) { 108795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]); 108805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->freeStates); 108825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->errTab != NULL) 108845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->errTab); 108855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->elemTab != NULL) { 108865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr exec; 108875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRelaxNGElemPop(ctxt); 108895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (exec != NULL) { 108905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeExecCtxt(exec); 108915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRelaxNGElemPop(ctxt); 108925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->elemTab); 108945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 108955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt); 108965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 108975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 108995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSetValidErrors: 109005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 109015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error function 109025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning function 109035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context 109045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 109055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the error and warning callback informations 109065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 109075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 109085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, 109095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityErrorFunc err, 109105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityWarningFunc warn, void *ctx) 109115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 109125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 109135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 109145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->error = err; 109155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->warning = warn; 109165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->userData = ctx; 109175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->serror = NULL; 109185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 109195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 109215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGSetValidStructuredErrors: 109225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 109235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @serror: the structured error function 109245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context 109255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 109265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the structured error callback 109275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 109285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 109295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, 109305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc serror, void *ctx) 109315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 109325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 109335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 109345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->serror = serror; 109355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->error = NULL; 109365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->warning = NULL; 109375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->userData = ctx; 109385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 109395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 109415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGGetValidErrors: 109425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 109435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error function result 109445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning function result 109455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context result 109465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 109475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the error and warning callback informations 109485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 109495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error and 0 otherwise 109505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 109515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 109525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, 109535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityErrorFunc * err, 109545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidityWarningFunc * warn, void **ctx) 109555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 109565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 109575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 109585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err != NULL) 109595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *err = ctxt->error; 109605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (warn != NULL) 109615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *warn = ctxt->warning; 109625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctx != NULL) 109635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ctx = ctxt->userData; 109645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 109655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 109665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 109685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRelaxNGValidateDoc: 109695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a Relax-NG validation context 109705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed document tree 109715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 109725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate a document tree in memory. 109735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 109745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the document is valid, a positive error code 109755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * number otherwise and -1 in case of internal or API error. 109765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 109775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 109785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) 109795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 109805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 109815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (doc == NULL)) 109835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 109845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->doc = doc; 109865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateDocument(ctxt, doc); 109885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 109895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove all left PSVI 109905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 109915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGCleanPSVI((xmlNodePtr) doc); 109925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 109945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: build error codes 109955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 109965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == -1) 109975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 109985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 109995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 110005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_relaxng 110025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h" 110035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SCHEMAS_ENABLED */ 11004