38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * relaxng.c : implementation of the Relax-NG handling and validity checking
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See Copyright for the status of this software.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Daniel Veillard <veillard@redhat.com>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * - add support for DTD compatibility spec
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * http://www.oasis-open.org/committees/relax-ng/compatibility-20011203.html
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * - report better mem allocations pbms at runtime and abort immediately.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The Relax-NG namespace
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic const xmlChar *xmlRelaxNGNs = (const xmlChar *)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(node->name, (const xmlChar *) type)) && \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Unimplemented block at %s:%d\n", \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGDocument xmlRelaxNGDocument;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGInclude xmlRelaxNGInclude;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef enum {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef enum {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGGrammarPtr parent; /* the parent grammar if any */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGGrammarPtr children; /* the children grammar if any */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGGrammarPtr next; /* the next grammar if any */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCombine combine; /* the default combine value */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr startList; /* list of <start> definitions */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef enum {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_NOOP = -1, /* a no operation from simplification */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_EXCEPT, /* except present in nameclass defs */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_DATATYPE, /* extenal data type definition */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_PARAM, /* extenal data type parameter */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_VALUE, /* value from an extenal data type definition */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_ATTRIBUTE, /* an attrbute following a pattern */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_EXTERNALREF, /* reference to an external def */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_PARENTREF, /* reference to a def in the parent grammar */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_ZEROORMORE, /* zero or more non empty patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_ONEORMORE, /* one or more non empty patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_CHOICE, /* a choice between non empty patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_GROUP, /* a pair/group of non empty patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_INTERLEAVE, /* interleaving choice of non-empty patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_RELAXNG_START /* Used to keep track of starts on grammars */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *name; /* the element local name if present */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *ns; /* the namespace local name if present */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr content; /* the expected content */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr parent; /* the parent definition, if any */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr next; /* list within grouping sequences */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr attrs; /* list of attributes for elements */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr nameClass; /* the nameClass definition if any */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr nextHash; /* next define in defs/refs hash tables */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegexpPtr contModel; /* a compiled content model if available */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * _xmlRelaxNG:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *_private; /* unused by the library for users or bindings */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDocumentPtr documents; /* all the documents loaded */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGIncludePtr includes; /* all the includes loaded */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGGrammarPtr grammar; /* the current grammar */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbWarnings; /* number of warnings at parse time */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *define; /* the current define scope */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashTablePtr interleaves; /* keep track of all the interleaves */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDocumentPtr documents; /* all the documents loaded */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGIncludePtr includes; /* all the includes loaded */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* the document stack */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDocumentPtr doc; /* Current parsed external ref */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* the include stack */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGIncludePtr inc; /* Current parsed include */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int incNr; /* Depth of the include parsing stack */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* used to compile content models */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataStatePtr state; /* used to build the automata */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGInterleaveGroup:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs partition set associated to lists of definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr rule; /* the rule to satisfy */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr *defs; /* the array of element definitions */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGPartitions:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs partition associated to an interleave group
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGPartition xmlRelaxNGPartition;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbgroups; /* number of groups in the partitions */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashTablePtr triage; /* hash table used to direct nodes to the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * right group when possible */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGValidState xmlRelaxNGValidState;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr seq; /* the sequence of children left to validate */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbAttrLeft; /* the number of attributes left to validate */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *value; /* the value when operating on string */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *endvalue; /* the end value when operating on string */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGStates:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs container for validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidError:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs validation error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGValidError xmlRelaxNGValidError;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A RelaxNGs validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Errors accumulated in branches may have to be stacked to be
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * provided back when it's sure they affect validation.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidErrorPtr errTab; /* stack of errors */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidStatePtr state; /* the current validation state */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGStatesPtr states; /* the accumulated state list */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGStatesPtr freeState; /* the pool of free valid states */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGStatesPtr *freeStates; /* the pool of free state groups */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This is used for "progressive" validation
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegExecCtxtPtr elem; /* the current element regexp */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr pdef; /* the non-streamable definition */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * outside the regexp */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGInclude:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Structure associated to a RelaxNGs document element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGIncludePtr next; /* keep a chain of includes */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDocument:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Structure associated to a RelaxNGs document element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDocumentPtr next; /* keep a chain of documents */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Some factorized error routines *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRngPErrMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: an Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle a redefinition of attribute error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRngVErrMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle a redefinition of attribute error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRngPErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node raising the error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @error: the error code
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @msg: message
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str1: extra info
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str2: extra info
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle a Relax NG Parsing error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *msg, const xmlChar * str1, const xmlChar * str2)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *) str1, (const char *) str2, NULL, 0, 0,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRngVErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node raising the error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @error: the error code
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @msg: message
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str1: extra info
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str2: extra info
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle a Relax NG Validation error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *msg, const xmlChar * str1, const xmlChar * str2)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *) str1, (const char *) str2, NULL, 0, 0,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Preliminary type checking interfaces *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGTypeHave:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to check if a type is exported
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGTypeCheck:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @result: place to store the result if needed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to check if a value match a type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFacetCheck:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @facet: the facet name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @val: the facet value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @strval: the string value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to check a value facet
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGTypeFree:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @result: the value to free
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to free a returned result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef void (*xmlRelaxNGTypeFree) (void *data, void *result);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGTypeCompare:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value1: the first value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value2: the second value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to compare two values accordingly
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to a type.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *namespace; /* the datatypeLibrary value */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGTypeCheck check; /* the checking function */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGTypeCompare comp; /* the compare function */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGFacetCheck facet; /* the facet check function */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGTypeFree freef; /* the freeing function */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocation functions *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlRelaxNGNormExtSpace(xmlChar * value);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeDocument:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @docu: a document structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG document structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeDocumentList:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @docu: a list of document structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG document structures.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeInclude:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @incl: a include structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG include structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeIncludeList:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @incl: a include structure list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG include structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewRelaxNG:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context (optional)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate a new RelaxNG structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the newly allocated structure or NULL in case or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeInnerSchema:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @schema: a schema structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG schema structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFree:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @schema: a schema structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewGrammar:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context (optional)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate a new RelaxNG grammar.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the newly allocated structure or NULL in case or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeGrammar:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @grammar: a grammar structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG grammar structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewDefine:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node in the input document.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate a new RelaxNG define.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the newly allocated structure or NULL in case or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreePartition:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @partitions: a partition set structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate RelaxNG partition set structures.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeDefine:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: a define structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG define structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewStates:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: the default size for the container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate a new RelaxNG validation state container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the newly allocated structure or NULL in case or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->freeState != NULL) && (ctxt->freeStatesNr > 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) +
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGAddStateUniq:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @states: the states container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @state: the validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Add a RelaxNG validation state to the container without checking
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * for unicity.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Return 1 in case of success and 0 if this is a duplicate and -1 on error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGAddState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @states: the states container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @state: the validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Add a RelaxNG validation state to the container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Return 1 in case of success and 0 if this is a duplicate and -1 on error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeStates:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @states: teh container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free a RelaxNG validation state container
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->freeStates == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (ctxt->freeStates == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewValidState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the current node or NULL for the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate a new RelaxNG validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the newly allocated structure or NULL in case or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCopyValidState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @state: a validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Copy the validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the newly allocated structure or NULL in case or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGEqualValidState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @state1: a validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @state2: a validation state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compare the validation states for equality
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if equald, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeValidState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @state: a validation state structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Deallocate a RelaxNG validation state structure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Semi internal functions *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxParserSetFlag:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a RelaxNG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @flags: a set of flags values
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Semi private function used to pass informations to a parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * which are a combination of xmlRelaxNGParserFlag .
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if success and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Document functions *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGIncludePush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the element doc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pushes a new include on top of the include stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of error, the index in the stack otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGIncludePop:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pops the top include from the include stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the include just removed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGRemoveRedefine:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the normalized URL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @target: the included target
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @name: the define name to eliminate
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Applies the elimination algorithm of 4.7
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of error, 1 in case of success.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Elimination of <include> define %s from %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGLoadInclude:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the normalized URL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the include node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ns: the namespace passed from the context.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * First lookup if the document is already loaded into the parser context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check against recursion. If not found the resource is loaded and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the content is preprocessed before being returned back to the caller.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlRelaxNGIncludePtr or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check against recursion in the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * load the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate the document structures and register it first.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * transmit the ns if needed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * push it on the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Some preprocessing of the document content, this include recursing
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in the include stack.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pop up the include from the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check that the top element is a grammar
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNG: included document is empty %s\n", URL,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNG: included document %s root is not a grammar\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Elimination of redefined rules in the include.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNG: include %s has a start but not the included grammar\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNG: include %s has define without name\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNG: include %s has a define %s but not the included grammar\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidErrorPush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error code
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg1: the first string argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg2: the second string argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @dup: arg need to be duplicated
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pushes a new error on top of the error stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of error, the index in the stack otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Pushing error %d at %d on stack\n", err, ctxt->errNr);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->err != NULL) && (ctxt->state != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidErrorPop:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pops the top error from the error stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDocumentPush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the element doc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pushes a new doc on top of the doc stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of error, the index in the stack otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDocumentPop:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pops the top doc from the doc stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the doc just removed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGLoadExternalRef:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the normalized URL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ns: the inherited ns if any
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * First lookup if the document is already loaded into the parser context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check against recursion. If not found the resource is loaded and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the content is preprocessed before being returned back to the caller.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlRelaxNGDocumentPtr or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check against recursion in the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * load the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate the document structures and register it first.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * transmit the ns if needed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * push it on the stack and register it in the hash table
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Some preprocessing of the document content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Error functions *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic const char *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("none");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("empty");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("notAllowed");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("except");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("text");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("element");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("datatype");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("value");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("list");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("attribute");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("def");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("ref");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("externalRef");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("parentRef");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("optional");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("zeroOrMore");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("oneOrMore");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("choice");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("group");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("interleave");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("start");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("noop");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("param");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ("unknown");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGetErrorString:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error code
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg1: the first string argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg2: the second string argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * computes a formatted error string for the given error code and args
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the error string, it must be deallocated by the caller
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "failed to validate type %s\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "failed to compare type %s\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (xmlCharStrdup("Internal error: no state\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (xmlCharStrdup("Internal error: no define\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Extra data in list: %s\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ("Internal: interleave block has no data\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (xmlCharStrdup("Invalid sequence in interleave\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Extra element %s in interleave\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Expecting a namespace for element %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element %s has wrong namespace: expecting %s\n", arg1,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Did not expect element %s there\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Did not expect text in element %s content\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Expecting no namespace for element %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Expecting an element %s, got nothing\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (xmlCharStrdup("Expecting an element got text\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Element %s failed to validate attributes\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Element %s failed to validate content\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Element %s has extra content: %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Invalid attribute %s for element %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Datatype element %s contains no data\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Datatype element %s has child elements\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Value element %s has child elements\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "List element %s has child elements\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Error validating datatype %s\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Error validating value %s\n", arg1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (xmlCharStrdup("No top grammar defined\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (xmlCharStrdup("Extra data in the document\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (msg[0] == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(msg, 1000, "Unknown error code %d\n", err);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGShowValidError:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @child: the node child generating the problem.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg1: the first argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg2: the second argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Show a validation error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngVErr(ctxt, (child == NULL ? node : child), err,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGPopErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @level: the error level in the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * pop and discard all errors until the given level is reached
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDumpValidError:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Show all validation error over a given index.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i, j, k;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (j = 0; j < i; j++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((err->err == dup->err) && (err->node == dup->node) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGAddValidError:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg1: the first argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @arg2: the second argument
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @dup: need to dup the args
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Register a validation error, either generating it if it's sure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or stacking it for later handling if unsure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * generate the error directly
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Flush first any stacked error which might be the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * real cause of the problem.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Stack the error for later processing if needed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Type library hooks *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSchemaTypeHave:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the given type is provided by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the W3C XMLSchema Datatype library.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSchemaTypeCheck:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the given type and value are validated by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the W3C XMLSchema Datatype library.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSchemaFacetCheck:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @facet: the facet name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @val: the facet value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @strval: the string value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to check a value facet
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "length")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlSchemaValidateFacet(typ, facet, strval, value);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSchemaFreeValue:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to free
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Function provided by a type library to free a Schemas value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSchemaTypeCompare:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value1: the first value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value2: the second value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compare two values for equality accordingly a type from the W3C XMLSchema
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Datatype library.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if equal, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((type == NULL) || (value1 == NULL) || (value2 == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDefaultTypeHave:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the given type is provided by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the default datatype library.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDefaultTypeCheck:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the value to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the given type and value are validated by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the default datatype library.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDefaultTypeCompare:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data needed for the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the type name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value1: the first value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value2: the second value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compare two values accordingly a type from the default
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * datatype library.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: trivial optimizations are possible by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * computing at compile-time
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeTypeLibrary:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @lib: the type library structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @namespace: the URI bound to the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free the structure associated to the type library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGRegisterTypeLibrary:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @namespace: the URI bound to the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: data associated to the library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @have: the provide function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @check: the checking function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @comp: the comparison function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Register a new type library
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Relax-NG types library '%s' already registered\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Relax-NG types library failed to register '%s'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGInitTypes:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Initilize the default type libraries.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to allocate sh table for Relax-NG types\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCleanupTypes:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Cleanup the default Schemas type library associated to RelaxNG
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compiling element content into regexp *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Sometime the element content can be compiled into a pure regexp, *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This allows a faster execution and streamability at that level *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGIsCompileable:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if a definition is nullable.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the element content is compileable
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Because the routine is recursive, we must guard against
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * discovering both COMPILABLE and NOT_COMPILABLE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "element content for %s is compilable\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "element content for %s is not compilable\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Problem in RelaxNGIsCompileable for element %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * All elements return a compileable status unless they
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * are generic like anyName
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((def->nameClass != NULL) || (def->name == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RelaxNGIsCompileable %s : true\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RelaxNGIsCompileable %s : false\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Problem in RelaxNGIsCompileable %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCompile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * ctxt: the RelaxNG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition tree to compile
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compile the set of definitions, it works recursively, till the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * element boundaries, where it tries to compile the content if possible
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if success and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * we can only use the automata if it is determinist
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * we can't build the content model for this element content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * but it still might be possible to build it for some of its
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * children, recurse.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* This should not happen and generate an internal error */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "RNG internal error trying to compile %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGTryCompile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * ctxt: the RelaxNG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition tree to compile
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try to compile the set of definitions, it works recursively,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * possibly ignoring parts which cannot be compiled.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if success and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "compiled the start\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "failed to compile the start\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "failed to compile element %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Parsing functions *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGIsNullable:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if a definition is nullable.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (define->type) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGIsBlank:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str: a string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if a string is ignorable c.f. 4.2. Whitespace
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*str != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGetDataTypeLibrary:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the current data or value element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Applies algorithm from 4.3. datatypeLibrary attribute
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the datatypeLibary value or NULL if not found
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlGetProp(node, BAD_CAST "datatypeLibrary");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret[0] == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlGetProp(node, BAD_CAST "datatypeLibrary");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret[0] == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseValue:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the data node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG value node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync library = xmlRelaxNGGetDataTypeLibrary(ctxt, node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Use of unregistered type library '%s'\n", library,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Internal error with type library '%s': no 'have'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error type '%s' is not exported by type library '%s'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (((node->children->type != XML_TEXT_NODE) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (node->children->type != XML_CDATA_SECTION_NODE)) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Expecting a single text value for <value>content\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lib->check(lib->data, def->name, def->value, &val, node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Value '%s' is not acceptable for type '%s'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseData:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the data node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG data node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync library = xmlRelaxNGGetDataTypeLibrary(ctxt, node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Use of unregistered type library '%s'\n", library,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Internal error with type library '%s': no 'have'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error type '%s' is not exported by type library '%s'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle optional params
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Type library '%s' does not allow type parameters\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync param->name = xmlGetProp(content, BAD_CAST "name");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle optional except
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync && (xmlStrEqual(content->name, BAD_CAST "except"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check there is no unhandled data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element data has unexpected content %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCompareNameClasses:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defs1: the first element/attribute defs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defs2: the second element/attribute defs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @name: the restriction on the name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ns: the restriction on the namespace
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compare the 2 lists of element definitions. The comparison is
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * that if both lists do not accept the same QNames, it returns 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If the 2 lists can accept the same QName the comparison returns 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 disttinct, 0 if equal
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCompareElemDefLists:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defs1: the first list of element/attribute defs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defs2: the second list of element/attribute defs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compare the 2 lists of element or attribute definitions. The comparison
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * is that if both lists do not accept the same QNames, it returns 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If the 2 lists can accept the same QName the comparison returns 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 disttinct, 0 if equal
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGenerateAttributes:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @def: the definition definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the definition can only generate attributes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if yes, 0 if no and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Don't run that check in case of error. Infinite recursion
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * becomes possible.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGetElements:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @def: the definition definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @eora: gather elements (0) or attributes (1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compute the list of top elements a definition can generate
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a list of elements or NULL if none was found.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Don't run that check in case of error. Infinite recursion
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * becomes possible.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Don't go within elements or attributes or string values.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Just gather the element top list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCheckChoiceDeterminism:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @def: the choice definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Also used to find indeterministic pattern in choice
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Don't run that check in case of error. Infinite recursion
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * becomes possible.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * a bit strong but safe
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbchild; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (j = 0; j < i; j++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbchild; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCheckGroupAttrs:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @def: the group definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Detects violations of rule 7.3
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Don't run that check in case of error. Infinite recursion
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * becomes possible.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbchild; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (j = 0; j < i; j++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbchild; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGComputeInterleaves:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @def: the interleave definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @name: the definition name
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A lot of work for preprocessing interleave definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * is potentially needed to get a decent execution speed at runtime
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * - trying to get a total order on the element nodes generated
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * by the interleaves, order the list of interleave definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * following that order.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * - if <text/> is used to handle mixed content, it is better to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flag this in the define and simplify the runtime checking
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * algorithm
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Don't run that check in case of error. Infinite recursion
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * becomes possible.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, " %d child\n", nbchild);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, " %d groups\n", nbgroups);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Let's check that all rules makes a partitions according to 7.4
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(partitions, 0, sizeof(xmlRelaxNGPartition));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbgroups; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element or text conflicts in interleave\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void *) (long) (i + 1));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void *) (long) (i + 1));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void *) (long) (i + 1));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void *) (long) (i + 1));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void *) (long) (i + 1));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and save the partition list back in the def
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErrMemory(ctxt, "in interleave computation\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbgroups; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseInterleave:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the data node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG interleave node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to add %s to hash table\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseInclude:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the include node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Integrate the content of an include node in the current grammar
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrEqual(root->name, BAD_CAST "grammar")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Include document root is not a grammar\n", NULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Merge the definition from both the include and the internal list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseDefine:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the define node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG define element node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "define name '%s' is not an NCName\n", name, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Internal error on define aggregation of %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGProcessExternalRef:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the externlRef node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Process and compile an externlRef node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlRelaxNGDefinePtr or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Then do the parsing for good
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * ns transmission rules
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Parsing to get a precompiled schemas.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync docu->schema = xmlRelaxNGParseDocument(ctxt, root);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the externalRef may be reused in a different ns context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParsePattern:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the pattern node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG pattern node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error or if no
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * pattern is generated.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error refs definitions '%s'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error refs definitions\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParse: notAllowed element is not empty\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found <grammar> pattern\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync grammar = xmlRelaxNGParseGrammar(ctxt, node->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Use of parentRef without a parent grammar\n", NULL,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "parentRef name '%s' is not an NCName\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashLookup(ctxt->parentgrammar->refs, def->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Internal error parentRef definitions '%s'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((def->content != NULL) && (def->content->next != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Unexpected node %s is not a pattern\n", node->name,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseAttribute:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the element node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG attribute node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParseattribute: attribute has no children\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RNG Internal error, noop found in attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseExceptNameClass:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the except node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @attr: 1 if within an attribute, 0 if within an element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG nameClass node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "exceptNameClass allows only a single except node\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseNameClass:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the nameClass node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @def: the current definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG nameClass node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element %s name '%s' is not an NCName\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "name '%s' is not an NCName\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute with namespace '%s' is not allowed\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute with QName 'xmlns' is not allowed\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGParseExceptNameClass(ctxt, node->children,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute with namespace '%s' is not allowed\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGParseExceptNameClass(ctxt, node->children,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "expecting name, anyName, nsName or choice : got %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseElement:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the element node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG element node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParseElement: element has no children\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParseElement: element has no content\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RNG Internal error, start found in element\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RNG Internal error, param found in element\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RNG Internal error, except found in element\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "RNG Internal error, noop found in element\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParsePatterns:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @nodes: list of nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @group: use an implicit <group> for elements
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG start node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the definition pointer or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseStart:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @nodes: start children nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG start node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success, -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseGrammarContent:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @nodes: grammar children nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse the content of a RelaxNG grammar node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success, -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCheckReference:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ref: the ref
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @name: the name associated to the defines
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Applies the 4.17. combine attribute rule for all the define
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * element of a given grammar using the same name.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Internal error: no grammar in CheckReference %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Internal error: reference has content in CheckReference %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCheckCombine:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the define(s) list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @name: the name associated to the defines
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Applies the 4.17. combine attribute rule for all the define
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * element of a given grammar using the same name.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync combine = xmlGetProp(cur->node, BAD_CAST "combine");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (choiceOrInterleave == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Defines for %s use both 'choice' and 'interleave'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Defines for %s use both 'choice' and 'interleave'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Defines for %s use unknown combine value '%s''\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Some defines for %s needs the combine attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGCheckCombine(): merging %s defines: %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * we need first to create a wrapper.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) <
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to add %s to hash table\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCombineStart:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @grammar: the grammar
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Applies the 4.17. combine rule for all the start
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * element of a given grammar.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->node == NULL) || (cur->node->parent == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync combine = xmlGetProp(cur->node->parent, BAD_CAST "combine");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (choiceOrInterleave == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "<start> use both 'choice' and 'interleave'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "<start> use both 'choice' and 'interleave'\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "<start> uses unknown combine value '%s''\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Some <start> element miss the combine attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGCombineStart(): merging <start>: %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) <
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to add %s to hash table\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCheckCycles:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @nodes: grammar children nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @depth: the counter
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check for cycles.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if check passed, and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Detected a cycle in %s references\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGTryUnlink:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the definition to unlink
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @parent: the parent definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @prev: the previous sibling definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try to unlink a definition. If not possble make it a NOOP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new prev definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSimplify:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @nodes: grammar children nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check for simplification of empty and notAllowed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * On Elements, try to move attribute only generating rules on
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the attrs rules.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * migrate cur->content to attrs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * cur->content can generate elements or text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * migrate tmp to attrs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This may result in a simplification
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the current node may have been transformed back
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGroupContentType:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ct1: the first content type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ct2: the second content type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try to group 2 content types
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the content type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGMaxContentType:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ct1: the first content type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ct2: the second content type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compute the max content-type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the content type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCheckRules:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @flags: some accumulated flags
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ptype: the parent type
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check for rules in section 7.1 and 7.2
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the content type of @cur
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This should actually be caught by list//element(ref) at the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * element boundaries, c.f. Bug #159968 local refs are dropped
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in step 4.19.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//ref\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The 7.3 Attribute derivation rule for groups is plugged there
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//element(ref)\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern list//element(ref)\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern attribute//element(ref)\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern attribute//element(ref)\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * reset since in the simple form elements are only child
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element %s attributes have a content type error\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element %s has a content type error\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern attribute//attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern list//attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern oneOrMore//group//attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern oneOrMore//interleave//attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern start//attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found anyName attribute without oneOrMore ancestor\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found nsName attribute without oneOrMore ancestor\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//oneOrMore\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern start//oneOrMore\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//list\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//group\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The 7.3 Attribute derivation rule for groups is plugged there
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern list//interleave\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//interleave\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern start//interleave\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//text\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found forbidden pattern data/except//empty\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseGrammar:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @nodes: grammar children nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse a Relax-NG <grammar> node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the internal xmlRelaxNGGrammarPtr built or
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Link the new grammar in the tree
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to parse <grammar> content\n", NULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Apply 4.17 mergingd rules to defines and starts
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * link together defines and refs in this grammar
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParseDocument:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the root node of the RelaxNG schema
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse a Relax-NG definition resource and build an internal
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNG struture which can be used to validate instances.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the internal XML RelaxNG structure built or
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Link the new grammar in the tree
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (schema->topgrammar->start->type == XML_RELAXNG_NOOP) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParseDocument() failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Reading RelaxNGs *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewParserCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the location of the schema
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create an XML RelaxNGs parse context for that file/resource expected
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to contain an XML RelaxNGs file.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the parser context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewMemParserCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: a pointer to a char array containing the schemas
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: the size of the array
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create an XML RelaxNGs parse context for that memory buffer expected
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to contain an XML RelaxNGs file.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the parser context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGNewMemParserCtxt(const char *buffer, int size)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewDocParserCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: a preparsed document tree
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create an XML RelaxNGs parser context for that document.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note: since the process of compiling a RelaxNG schemas modifies the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * document, the @doc parameter is duplicated internally.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the parser context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeParserCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the schema parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free the resources associated to the schema parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNormExtSpace:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: a value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Removes the leading and ending spaces of the value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The string is modified "in situ"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*cur == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } while (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*cur == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* don't try to normalize the inner spaces */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*cur == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } while (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCleanupAttributes:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: a Relax-NG node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check all the attributes on the given node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrEqual(node->name, BAD_CAST "element")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrEqual(node->name, BAD_CAST "attribute")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrEqual(node->name, BAD_CAST "parentRef")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s is not allowed on %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(cur->name, BAD_CAST "type")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrEqual(node->name, BAD_CAST "value")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s is not allowed on %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(cur->name, BAD_CAST "href")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s is not allowed on %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrEqual(node->name, BAD_CAST "start")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s is not allowed on %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = xmlNodeListGetString(node->doc, cur->children, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (val[0] != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s contains invalid URI %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s URI %s is not absolute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attribute %s URI %s has a fragment ID\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCleanupTree:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @root: an xmlNodePtr subtree
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Cleanup the subtree from unwanted nodes for parsing, resolve
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Include and externalRef lookups.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Simplification 4.1. Annotations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(cur->parent->name, BAD_CAST "value")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "element %s doesn't allow foreign elements\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParse: externalRef has no href attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Incorrect URI for externalRef %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Fragment forbidden in URI for externalRef %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to compute URL for externalRef %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(cur->name, BAD_CAST "include")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParse: include has no href attribute\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to compute URL for include %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Simplification 4.8. name attribute of element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and attribute elements
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to create a name %s element\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* xmlUnsetProp(cur, BAD_CAST "ns"); */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Simplification 4.8. name attribute of element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and attribute elements
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Simplification: 4.10. QNames
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParse: no namespace for prefix %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found nsName/except//nsName forbidden construct\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found anyName/except//anyName forbidden construct\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Found nsName/except//anyName forbidden construct\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Thisd is not an else since "include" is transformed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * into a div
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * implements rule 4.11
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Since we are about to delete cur, if it's nsDef is non-NULL we
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * need to preserve it (it contains the ns definitions for the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * children we just moved). We'll just stick it on to the end
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * of cur->parent's list, since it's never going to be re-serialized
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * (bug 143738).
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Simplification 4.2 whitespaces
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Skip to next node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGCleanupDoc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: an xmldocPtr document pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Cleanup the document from unwanted nodes for parsing, resolve
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Include and externalRef lookups.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the cleaned up document or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Extract the root
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGParse:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * parse a schema definition resource and build an internal
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * XML Shema struture which can be used to validate instances.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the internal XML RelaxNG structure built from the resource or
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * First step is to parse the input document into an DOM/Infoset
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc = xmlReadFile((const char *) ctxt->URL,NULL,0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParse: could not parse schemas\n", NULL,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGParse: nothing to parse\n", NULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Some preprocessing of the document content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Then do the parsing for good
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check the ref/defines links
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to preprocess interleaves
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if there was a parsing error return NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to compile (parts of) the schemas
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->topgrammar->start->type != XML_RELAXNG_START) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Transfer the pointer for cleanup at the schema level.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSetParserErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error callback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @warn: the warning callback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: contextual data for the callbacks
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Set the callback functions used to handle errors for a validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGetParserErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error callback result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @warn: the warning callback result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: contextual data for the callbacks result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Get the callback information used to handle errors for a validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns -1 in case of failure, 0 otherwise.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSetParserStructuredErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @serror: the error callback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: contextual data for the callbacks
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Set the callback functions used to handle errors for a parsing context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump back a compiled form *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDumpDefines:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @output: the file output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defines: a list of define structures
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a RelaxNG structure back
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDumpDefine:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @output: the file output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: a define structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a RelaxNG structure back
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (define->type) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDumpGrammar:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @output: the file output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @grammar: a grammar structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @top: is this a top grammar
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a RelaxNG structure back
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(output, " <!-- invalid combine value -->");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* TODO ? Dump the defines ? */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @output: the file output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @schema: a schema structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a RelaxNG structure back
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(output, "RelaxNG empty or failed to compile\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGDumpTree:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @output: the file output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @schema: a schema structure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump the transformed RelaxNG tree.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(output, "RelaxNG empty or failed to compile\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validation of compiled content *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateCompiledCallback:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @exec: the regular expression instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @token: the token which matched
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @transdata: callback data, the define for the subelement if available
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync @ @inputdata: callback data, the Relax NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle the callback and if needed validate the element children.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s missing context\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s missing define\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s missing info\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s define is not element\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateCompiledContent:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the RelaxNG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @regexp: the regular expression as compiled
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @content: list of children to test against the regexp
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the content model of an element or start using the regexp
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success, -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Switch to next element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: get some of the names needed to exit the current state of exec
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * There might be content model errors outside of the pure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * regexp validation, e.g. for attribute values.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Progressive validation of when possible *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGElemPush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @exec: the regexp runtime for the new content model
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Push a new regexp for the current node content model on the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGElemPop:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pop the regexp of the current node content model from the stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the exec or NULL if empty
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateProgressiveCallback:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @exec: the regular expression instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @token: the token which matched
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @transdata: callback data, the define for the subelement if available
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync @ @inputdata: callback data, the Relax NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle the callback and if needed validate the element children.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * some of the in/out informations are passed via the context in @inputdata.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s missing context\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s missing define\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s missing info\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "callback on %s define is not element\n", token);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * this node cannot be validated in a streamable fashion
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Element '%s' validation is not streamable\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the attributes part of the content.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * validation error, log the message for the "best" one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidatePushElement:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: a document instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @elem: an element instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Push a new element start on the RelaxNG validation stack.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns 1 if no validation problem was found or 0 if validating the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * element requires a full node, and -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((grammar == NULL) || (grammar->start == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidatePushCData:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the RelaxNG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: some character data read
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: the lenght of the data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check the CData parsed for validation in the current stack
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns 1 if no validation problem was found or -1 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*data != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "CDATA failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidatePopElement:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the RelaxNG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: a document instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @elem: an element instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Pop the element end from the RelaxNG validation stack.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns 1 if no validation problem was found or 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * verify that we reached a terminal state of the content model.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: get some of the names needed to exit the current state of exec
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ret < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateFullElement:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: a document instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @elem: an element instance
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate a full subtree when xmlRelaxNGValidatePushElement() returned
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * 0 and the content of the node has been expanded.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns 1 if no validation problem was found or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync state = xmlRelaxNGNewValidState(ctxt, elem->parent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Generic interpreted validation implementation *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSkipIgnored:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a schema validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the top node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Skip ignorable nodes in that context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new sibling or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO complete and handle entities
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNormalize:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a schema validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str: the string to normalize
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Implements the normalizeWhiteSpace( s ) function from
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * section 6.2.9 of the spec
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new string or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*tmp != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*str != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p++ = ' ';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateDatatype:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @value: the string value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @type: the datatype definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given value against the dataype
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lib->check(lib->data, define->name, value, &result, node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = lib->check(lib->data, define->name, value, NULL, node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = lib->facet(lib->data, define->name, cur->name,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateValue(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNextValue:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Skip to the next value when validating within a list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the operation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur == NULL) || (ctxt->state->endvalue == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*cur != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((cur != ctxt->state->endvalue) && (*cur == 0))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateValueList:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defines: the list of definitions to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given set of definitions for the current value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateValue:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given definition for the current value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (define->type) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void *) define->attrs,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: trivial optimizations are possible by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * computing at compile-time
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDatatype(ctxt, value, define,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*cur != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "list value: '%s' found %d items\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((*cur == 0) && (cur != ctxt->state->endvalue))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to validate value: '%s' with %d rule\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateValueList(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* no break on purpose */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((cur != NULL) && (cur != ctxt->state->endvalue) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidateValueList(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateValue(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateValueContent:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @defines: the list of definitions to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given definitions for the current value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGAttributeMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @prop: the attribute
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the attribute matches the definition nameClass
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if the attribute matches, 0 if no, or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define->ns[0] == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync define = define->nameClass;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateAttribute:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given attribute definition for that node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((((define->ns == NULL) || (define->ns[0] == 0)) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync value = xmlNodeListGetString(prop->doc, prop->children, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateValueContent(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flag the attribute as processed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGValidateAttribute(%s): %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync value = xmlNodeListGetString(prop->doc, prop->children, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateValueContent(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flag the attribute as processed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGValidateAttribute(anyName): %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateAttributeList:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the list of definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given node against the list of attribute definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) || (ctxt->states != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNodeMatchesList:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @list: a NULL terminated array of definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if a node can be matched by one of the definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateInterleave:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate an interleave definition for a node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync partitions = (xmlRelaxNGPartitionPtr) define->data;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Optimizations for MIXED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * this is a pure <mixed> case
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Build arrays to store the first and last node of the chain
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * pertaining to each group
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Walk the sequence of children finding the right group and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * sorting them in sequences.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlHashLookup2(partitions->triage, cur->name,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlHashLookup2(partitions->triage, BAD_CAST "#any",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbgroups; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We break as soon as an element not matched is found
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < nbgroups; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDefinition(ctxt, group->rule);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * PBM: what happen if there is attributes checks in the interleaves
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* try to keep the latest one to mach old heuristic */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (found == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* try to keep the latest one to mach old heuristic */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * BIG PBM: here we pick only one restarting point :-(
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->states->tabState[ctxt->states->nbState - 1] = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * builds the next links chain from the prev one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateDefinitionList:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the list of definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given node content against the (list) of definitions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) || (ctxt->states != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGElementMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @elem: the element
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if the element matches the definition nameClass
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if the element matches, 0 if no, or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((define->ns != NULL) && (define->ns[0] != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (!xmlStrEqual(elem->ns->href, define->ns)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((elem->ns != NULL) && (define->ns != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((elem->ns != NULL) && (define->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync define = define->nameClass;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGBestState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Find the "best" state in the ctxt->states list of states to report
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * errors about. I.e. a state with no element left in the child list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or the one with the less attributes left.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This is called only if a falidation error was detected
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the index of the "best" state or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGLogBestError:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Find the "best" state in the ctxt->states list of states to report
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * errors about and log it.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((best >= 0) && (best < ctxt->states->nbState)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateElementEnd:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @dolog: indicate that error logging should be done
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the end of the element, implements check that
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * there is nothing left not consumed in the element content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or in the attribute list.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1 - i);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateState:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the current state against the definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (define == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Start validating %s ", xmlRelaxNGDefName(define));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "%s ", define->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (define->type) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This node was already validated successfully against
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * this definition.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret <= 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Validating content of '%s' : %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * validation error, log the message for the "best" one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * validation error, log the message for the "best" one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlRelaxNGValidateDefinition(): validated %s : %d",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, ": no state\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, ": done\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, ": next elem %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, ": next %s %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* no break on purpose */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * All the input states are also exit states
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Collect all the new nodes added at that step
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and make them the new node set
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * errors may have to be propagated back...
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((define->dflags & IS_TRIABLE) && (define->data != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * node == NULL can't be optimized since IS_TRIABLE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * doesn't account for choice which may lead to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * only attributes.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Something we can optimize cleanly there is only one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * possble branch out !
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* TODO: handle entities ... */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDatatype(ctxt, content, define,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* TODO: handle entities ... */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Make sure it's only text nodes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* TODO: handle entities ... */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "%s ", define->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "suceeded\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, "failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateDefinition:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @define: the definition to verify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the current node lists against the definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We should NOT have both ctxt->state and ctxt->states
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We should NOT have both ctxt->state and ctxt->states
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* add the state to the container */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* add the state directly in states */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* make it the new container and copy other results */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (k = 0; k < j; k++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* add all the new results to res and reff the container */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (j > 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (j == 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateDocument:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the given document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the validation succeeded or an error code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->state != NULL) && (state->seq != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "%d Extra error messages left on stack !\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_VALID_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validation interfaces *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGNewValidCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @schema: a precompiled XML RelaxNGs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create an XML RelaxNGs validation context based on the given schema
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the validation context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGFreeValidCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the schema validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free the resources associated to the schema validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSetValidErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @warn: the warning function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: the functions context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Set the error and warning callback informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGSetValidStructuredErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @serror: the structured error function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: the functions context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Set the structured error callback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGGetValidErrors:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @err: the error function result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @warn: the warning function result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: the functions context result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Get the error and warning callback informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns -1 in case of error and 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRelaxNGValidateDoc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a Relax-NG validation context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: a parsed document tree
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate a document tree in memory.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if the document is valid, a positive error code
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * number otherwise and -1 in case of internal or API error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: build error codes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_SCHEMAS_ENABLED */