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