1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * relaxng.c : implementation of the Relax-NG handling and validity checking 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <veillard@redhat.com> 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - add support for DTD compatibility spec 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.oasis-open.org/committees/relax-ng/compatibility-20011203.html 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - report better mem allocations pbms at runtime and abort immediately. 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SCHEMAS_ENABLED 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h> 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/relaxng.h> 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemastypes.h> 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlautomata.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlregexp.h> 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemastypes.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The Relax-NG namespace 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlRelaxNGNs = (const xmlChar *) 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://relaxng.org/ns/structure/1.0"; 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define IS_RELAXNG(node, typ) \ 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node != NULL) && (node->ns != NULL) && \ 4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun (node->type == XML_ELEMENT_NODE) && \ 4594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun (xmlStrEqual(node->name, (const xmlChar *) typ)) && \ 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(node->ns->href, xmlRelaxNGNs))) 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG 1 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_GRAMMAR 1 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_CONTENT 1 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_TYPE 1 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID 1 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_INTERLEAVE 1 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_LIST 1 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define DEBUG_INCLUDE 1 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_ERROR 1 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_COMPILE 1 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_PROGRESSIVE 1 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ERROR 5 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO \ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGSchema xmlRelaxNGSchema; 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr; 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDefine xmlRelaxNGDefine; 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr; 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDocument xmlRelaxNGDocument; 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr; 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInclude xmlRelaxNGInclude; 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr; 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_COMBINE_UNDEFINED = 0, /* undefined */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_COMBINE_CHOICE, /* choice */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_COMBINE_INTERLEAVE /* interleave */ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGCombine; 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_ERROR = -1, 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_EMPTY = 0, 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_SIMPLE, 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_COMPLEX 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGContentType; 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar; 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr; 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGGrammar { 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr parent; /* the parent grammar if any */ 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr children; /* the children grammar if any */ 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr next; /* the next grammar if any */ 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr start; /* <start> content */ 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCombine combine; /* the default combine value */ 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr startList; /* list of <start> definitions */ 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr defs; /* define* */ 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr refs; /* references */ 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_NOOP = -1, /* a no operation from simplification */ 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_EMPTY = 0, /* an empty pattern */ 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_NOT_ALLOWED, /* not allowed top */ 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_EXCEPT, /* except present in nameclass defs */ 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_TEXT, /* textual content */ 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ELEMENT, /* an element */ 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_DATATYPE, /* extenal data type definition */ 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_PARAM, /* extenal data type parameter */ 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_VALUE, /* value from an extenal data type definition */ 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_LIST, /* a list of patterns */ 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ATTRIBUTE, /* an attrbute following a pattern */ 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_DEF, /* a definition */ 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_REF, /* reference to a definition */ 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_EXTERNALREF, /* reference to an external def */ 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_PARENTREF, /* reference to a def in the parent grammar */ 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_OPTIONAL, /* optional patterns */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ZEROORMORE, /* zero or more non empty patterns */ 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ONEORMORE, /* one or more non empty patterns */ 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CHOICE, /* a choice between non empty patterns */ 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_GROUP, /* a pair/group of non empty patterns */ 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_INTERLEAVE, /* interleaving choice of non-empty patterns */ 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_START /* Used to keep track of starts on grammars */ 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGType; 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NULLABLE (1 << 0) 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_NULLABLE (1 << 1) 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_INDETERMINIST (1 << 2) 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_MIXED (1 << 3) 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_TRIABLE (1 << 4) 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_PROCESSED (1 << 5) 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_COMPILABLE (1 << 6) 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_COMPILABLE (1 << 7) 153df143a5041f03a22808b59c76698770b74692815Selim Gurun#define IS_EXTERNAL_REF (1 << 8) 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDefine { 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGType type; /* the type of definition */ 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the node in the source */ 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; /* the element local name if present */ 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns; /* the namespace local name if present */ 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; /* value when available */ 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; /* data lib or specific pointer */ 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr content; /* the expected content */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr parent; /* the parent definition, if any */ 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr next; /* list within grouping sequences */ 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr attrs; /* list of attributes for elements */ 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr nameClass; /* the nameClass definition if any */ 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr nextHash; /* next define in defs/refs hash tables */ 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project short depth; /* used for the cycle detection */ 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project short dflags; /* define related flags */ 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr contModel; /* a compiled content model if available */ 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlRelaxNG: 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs definition 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNG { 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *_private; /* unused by the library for users or bindings */ 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr topgrammar; 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idref; /* requires idref checking */ 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr defs; /* define */ 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr refs; /* references */ 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr includes; /* all the includes loaded */ 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int defNr; /* number of defines used */ 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ATTRIBUTE (1 << 0) 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ONEORMORE (1 << 1) 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_LIST (1 << 2) 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_DATAEXCEPT (1 << 3) 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_START (1 << 4) 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMGROUP (1 << 5) 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6) 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_EXTERNALREF (1 << 7) 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ANYEXCEPT (1 << 8) 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_NSEXCEPT (1 << 9) 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGParserCtxt { 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userData; /* user specific data block */ 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror; 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err; 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* The schema in use */ 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; /* the current grammar */ 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */ 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* parser flags */ 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbErrors; /* number of errors at parse time */ 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbWarnings; /* number of warnings at parse time */ 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *define; /* the current define scope */ 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; /* the current define */ 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbInterleaves; 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr interleaves; /* keep track of all the interleaves */ 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr includes; /* all the includes loaded */ 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URL; 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr document; 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int defNr; /* number of defines used */ 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int defMax; /* number of defines aloocated */ 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *buffer; 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the document stack */ 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr doc; /* Current parsed external ref */ 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int docNr; /* Depth of the parsing stack */ 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int docMax; /* Max depth of the parsing stack */ 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr *docTab; /* array of docs */ 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the include stack */ 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr inc; /* Current parsed include */ 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int incNr; /* Depth of the include parsing stack */ 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int incMax; /* Max depth of the parsing stack */ 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr *incTab; /* array of incs */ 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idref; /* requires idref checking */ 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* used to compile content models */ 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr am; /* the automata */ 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr state; /* used to build the automata */ 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int crng; /* compact syntax and other flags */ 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int freedoc; /* need to free the document */ 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_IGNORABLE 1 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NEGATIVE 2 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_MIXED_CONTENT 4 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NOERROR 8 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInterleaveGroup: 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition set associated to lists of definitions 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup; 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr; 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInterleaveGroup { 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr rule; /* the rule to satisfy */ 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *defs; /* the array of element definitions */ 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */ 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_DETERMINIST 1 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NEEDCHECK 2 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPartitions: 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition associated to an interleave group 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGPartition xmlRelaxNGPartition; 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr; 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGPartition { 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbgroups; /* number of groups in the partitions */ 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr triage; /* hash table used to direct nodes to the 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * right group when possible */ 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* determinist ? */ 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr *groups; 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidState: 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation state 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ATTR 20 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidState xmlRelaxNGValidState; 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr; 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidState { 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the current node */ 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr seq; /* the sequence of children left to validate */ 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAttrs; /* the number of attributes */ 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxAttrs; /* the size of attrs */ 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAttrLeft; /* the number of attributes left to validate */ 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; /* the value when operating on string */ 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *endvalue; /* the end value when operating on string */ 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *attrs; /* the array of attributes */ 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGStates: 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs container for validation state 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGStates xmlRelaxNGStates; 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGStates *xmlRelaxNGStatesPtr; 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGStates { 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbState; /* the number of states */ 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxState; /* the size of the array */ 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr *tabState; 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR_IS_DUP 1 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidError: 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation error 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidError xmlRelaxNGValidError; 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr; 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidError { 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err; /* the error number */ 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* flags */ 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the current node */ 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr seq; /* the current child */ 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *arg1; /* first arg */ 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *arg2; /* second arg */ 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidCtxt: 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation context 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidCtxt { 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userData; /* user specific data block */ 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror; 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbErrors; /* number of errors in validation */ 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* The schema in use */ 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* the document being validated */ 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* validation flags */ 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth; /* validation depth */ 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idref; /* requires idref checking */ 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errNo; /* the first error found */ 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Errors accumulated in branches may have to be stacked to be 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * provided back when it's sure they affect validation. 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr err; /* Last error */ 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errNr; /* Depth of the error stack */ 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errMax; /* Max depth of the error stack */ 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr errTab; /* stack of errors */ 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; /* the current validation state */ 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states; /* the accumulated state list */ 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr freeState; /* the pool of free valid states */ 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int freeStatesNr; 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int freeStatesMax; 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr *freeStates; /* the pool of free state groups */ 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is used for "progressive" validation 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr elem; /* the current element regexp */ 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int elemNr; /* the number of element validated */ 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int elemMax; /* the max depth of elements */ 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */ 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int pstate; /* progressive state */ 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr pnode; /* the current node */ 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr pdef; /* the non-streamable definition */ 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int perr; /* signal error in content model 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * outside the regexp */ 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInclude: 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInclude { 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr next; /* keep a chain of includes */ 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href; /* the normalized href value */ 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* the associated XML document */ 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr content; /* the definitions */ 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* the schema */ 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocument: 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDocument { 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr next; /* keep a chain of documents */ 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href; /* the normalized href value */ 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* the associated XML document */ 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr content; /* the definitions */ 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* the schema */ 419df143a5041f03a22808b59c76698770b74692815Selim Gurun int externalRef; /* 1 if an external ref */ 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 42594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Some factorized error routines * 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErrMemory: 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an Relax-NG parser context 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra) 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGP, 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGP, 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErrMemory: 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra) 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGV, 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGV, 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErr: 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: message 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra info 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra info 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Parsing error 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error, 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, const xmlChar * str2) 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, node, XML_FROM_RELAXNGP, 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error, XML_ERR_ERROR, NULL, 0, 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, (const char *) str2, NULL, 0, 0, 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, str1, str2); 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErr: 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: message 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra info 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra info 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Validation error 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error, 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, const xmlChar * str2) 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, node, XML_FROM_RELAXNGV, 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error, XML_ERR_ERROR, NULL, 0, 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, (const char *) str2, NULL, 0, 0, 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, str1, str2); 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 56894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 56994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Preliminary type checking interfaces * 57094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeHave: 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a type is exported 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type); 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCheck: 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result: place to store the result if needed 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a value match a type 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type, 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value, void **result, 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node); 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFacetCheck: 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the facet name 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the facet value 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval: the string value 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type, 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * facet, 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * val, 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * strval, void *value); 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeFree: 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result: the value to free 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a returned result 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef void (*xmlRelaxNGTypeFree) (void *data, void *result); 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCompare: 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1: the first value 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to compare two values accordingly 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to a type. 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type, 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value1, 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt1, 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *comp1, 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value2, 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt2); 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary; 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr; 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGTypeLibrary { 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *namespace; /* the datatypeLibrary value */ 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; /* data needed for the library */ 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeHave have; /* the export function */ 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCheck check; /* the checking function */ 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCompare comp; /* the compare function */ 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFacetCheck facet; /* the facet check function */ 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeFree freef; /* the freeing function */ 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 65894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 65994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Allocation functions * 66094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGNormExtSpace(xmlChar * value); 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema); 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ATTRIBUTE_UNUSED, 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state1, 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state2); 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state); 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocument: 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu: a document structure 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structure. 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu) 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu == NULL) 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->href != NULL) 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(docu->href); 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->doc != NULL) 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(docu->doc); 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->schema != NULL) 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeInnerSchema(docu->schema); 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(docu); 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocumentList: 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu: a list of document structure 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structures. 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu) 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr next; 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (docu != NULL) { 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = docu->next; 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocument(docu); 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu = next; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInclude: 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl: a include structure 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure. 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl) 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl == NULL) 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl->href != NULL) 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(incl->href); 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl->doc != NULL) 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(incl->doc); 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl->schema != NULL) 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFree(incl->schema); 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(incl); 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeIncludeList: 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl: a include structure list 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure. 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl) 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr next; 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (incl != NULL) { 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = incl->next; 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeInclude(incl); 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project incl = next; 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewRelaxNG: 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context (optional) 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG structure. 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt) 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr ret; 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG)); 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, NULL); 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNG)); 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInnerSchema: 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG schema structure. 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema) 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc != NULL) 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(schema->doc); 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->defTab != NULL) { 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < schema->defNr; i++) 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDefine(schema->defTab[i]); 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema->defTab); 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema); 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFree: 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG structure. 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFree(xmlRelaxNGPtr schema) 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar != NULL) 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeGrammar(schema->topgrammar); 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc != NULL) 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(schema->doc); 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->documents != NULL) 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocumentList(schema->documents); 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->includes != NULL) 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeIncludeList(schema->includes); 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->defTab != NULL) { 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < schema->defNr; i++) 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDefine(schema->defTab[i]); 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema->defTab); 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema); 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewGrammar: 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context (optional) 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG grammar. 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt) 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr ret; 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar)); 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, NULL); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGGrammar)); 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeGrammar: 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar: a grammar structure 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG grammar structure. 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar) 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->children != NULL) { 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeGrammar(grammar->children); 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->next != NULL) { 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeGrammar(grammar->next); 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->refs != NULL) { 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(grammar->refs, NULL); 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->defs != NULL) { 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(grammar->defs, NULL); 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(grammar); 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDefine: 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node in the input document. 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG define. 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret; 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->defMax == 0) { 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defMax = 16; 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defNr = 0; 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab = (xmlRelaxNGDefinePtr *) 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr)); 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->defTab == NULL) { 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating define\n"); 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->defMax <= ctxt->defNr) { 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *tmp; 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defMax *= 2; 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab, 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defMax * 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGDefinePtr)); 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating define\n"); 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab = tmp; 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine)); 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating define\n"); 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGDefine)); 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab[ctxt->defNr++] = ret; 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = node; 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->depth = -1; 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreePartition: 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @partitions: a partition set structure 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate RelaxNG partition set structures. 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions) 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr group; 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j; 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions != NULL) { 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->groups != NULL) { 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < partitions->nbgroups; j++) { 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[j]; 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group != NULL) { 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group->defs != NULL) 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(group->defs); 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group->attrs != NULL) 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(group->attrs); 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(group); 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(partitions->groups); 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->triage != NULL) { 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(partitions->triage, NULL); 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(partitions); 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDefine: 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: a define structure 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG define structure. 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define) 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) { 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) define->data; 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((lib != NULL) && (lib->freef != NULL)) 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef(lib->data, (void *) define->attrs); 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE)) 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data); 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE)) 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree((xmlHashTablePtr) define->data, NULL); 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define->name); 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define->ns); 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->value != NULL) 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define->value); 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel != NULL) 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRegexp(define->contModel); 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define); 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewStates: 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the default size for the container 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state container 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGStatesPtr 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size) 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr ret; 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && 1012df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->freeStates != NULL) && (ctxt->freeStatesNr > 0)) { 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesNr--; 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->freeStates[ctxt->freeStatesNr]; 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbState = 0; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size < 16) 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = 16; 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) + 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size - 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1) * 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRelaxNGValidStatePtr)); 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbState = 0; 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxState = size; 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) * 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr)); 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->tabState == NULL) { 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddStateUniq: 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states: the states container 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: the validation state 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container without checking 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for unicity. 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt, 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states, 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states->nbState >= states->maxState) { 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr *tmp; 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = states->maxState * 2; 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size) * 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr)); 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "adding states\n"); 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState = tmp; 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->maxState = size; 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[states->nbState++] = state; 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddState: 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states: the states container 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: the validation state 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt, 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states, 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states->nbState >= states->maxState) { 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr *tmp; 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = states->maxState * 2; 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size) * 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr)); 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "adding states\n"); 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState = tmp; 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->maxState = size; 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < states->nbState; i++) { 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) { 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[states->nbState++] = state; 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeStates: 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states: teh container 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a RelaxNG validation state container 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt, 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states) 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->freeStates == NULL)) { 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesMax = 40; 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesNr = 0; 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStates = (xmlRelaxNGStatesPtr *) 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr)); 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeStates == NULL) { 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "storing states\n"); 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((ctxt != NULL) 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) { 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr *tmp; 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates, 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * ctxt->freeStatesMax * 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGStatesPtr)); 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "storing states\n"); 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states->tabState); 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states); 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStates = tmp; 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesMax *= 2; 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->freeStates == NULL)) { 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states->tabState); 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states); 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStates[ctxt->freeStatesNr++] = states; 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidState: 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current node or NULL for the document 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node) 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr ret; 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attrs[MAX_ATTR]; 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAttrs = 0; 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root = NULL; 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(ctxt->doc); 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = node->properties; 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs < MAX_ATTR) 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrs[nbAttrs++] = attr; 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbAttrs++; 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->next; 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeState->nbState--; 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr) 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGValidState)); 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGValidState)); 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->value = NULL; 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->endvalue = NULL; 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = (xmlNodePtr) ctxt->doc; 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->seq = root; 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = node; 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->seq = node->children; 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = 0; 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs > 0) { 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs < 4) 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = 4; 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = nbAttrs; 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret->maxAttrs < nbAttrs) { 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *tmp; 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs * 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = tmp; 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = nbAttrs; 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = nbAttrs; 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs < MAX_ATTR) { 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs); 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = node->properties; 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbAttrs = 0; 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs[nbAttrs++] = attr; 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->next; 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrLeft = ret->nbAttrs; 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCopyValidState: 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a validation state 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy the validation state 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt, 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr ret; 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int maxAttrs; 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *attrs; 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeState->nbState--; 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr) 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGValidState)); 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGValidState)); 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrs = ret->attrs; 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxAttrs = ret->maxAttrs; 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret, state, sizeof(xmlRelaxNGValidState)); 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = attrs; 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = maxAttrs; 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbAttrs > 0) { 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = state->maxAttrs; 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = 0; 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret->maxAttrs < state->nbAttrs) { 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *tmp; 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs * 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = 0; 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = state->maxAttrs; 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = tmp; 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret->attrs, state->attrs, 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nbAttrs * sizeof(xmlAttrPtr)); 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGEqualValidState: 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state1: a validation state 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state2: a validation state 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the validation states for equality 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equald, 0 otherwise 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state1, 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state2) 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state1 == NULL) || (state2 == NULL)) 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1 == state2) 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->node != state2->node) 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->seq != state2->seq) 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->nbAttrLeft != state2->nbAttrLeft) 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->nbAttrs != state2->nbAttrs) 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->endvalue != state2->endvalue) 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state1->value != state2->value) && 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(state1->value, state2->value))) 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < state1->nbAttrs; i++) { 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->attrs[i] != state2->attrs[i]) 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidState: 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a validation state structure 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG validation state structure. 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->freeState == NULL)) { 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40); 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->freeState == NULL)) { 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->attrs != NULL) 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state->attrs); 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state); 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state); 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 140194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 140294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Semi internal functions * 140394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxParserSetFlag: 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a RelaxNG parser context 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: a set of flags values 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Semi private function used to pass informations to a parser context 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which are a combination of xmlRelaxNGParserFlag . 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags) 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(-1); 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNGP_FREE_DOC) { 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->crng |= XML_RELAXNGP_FREE_DOC; 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags -= XML_RELAXNGP_FREE_DOC; 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNGP_CRNG) { 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->crng |= XML_RELAXNGP_CRNG; 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags -= XML_RELAXNGP_CRNG; 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags != 0) return(-1); 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 143394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 143494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Document functions * 143594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc); 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePush: 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the element doc 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new include on top of the include stack 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt, 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr value) 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab == NULL) { 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incMax = 4; 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incNr = 0; 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab = 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGIncludePtr *) xmlMalloc(ctxt->incMax * 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->incTab[0])); 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab == NULL) { 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating include\n"); 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incNr >= ctxt->incMax) { 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incMax *= 2; 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab = 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGIncludePtr *) xmlRealloc(ctxt->incTab, 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incMax * 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->incTab[0])); 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab == NULL) { 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating include\n"); 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab[ctxt->incNr] = value; 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = value; 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->incNr++); 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePop: 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top include from the include stack 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the include just removed 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt) 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr ret; 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incNr <= 0) 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incNr--; 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incNr > 0) 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = ctxt->incTab[ctxt->incNr - 1]; 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = NULL; 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->incTab[ctxt->incNr]; 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab[ctxt->incNr] = NULL; 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRemoveRedefine: 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the normalized URL 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @target: the included target 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the define name to eliminate 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the elimination algorithm of 4.7 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, 1 in case of success. 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt, 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * URL ATTRIBUTE_UNUSED, 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr target, const xmlChar * name) 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp, tmp2; 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name2; 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Elimination of <include> start from %s\n", URL); 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Elimination of <include> define %s from %s\n", 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, URL); 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = target; 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = tmp->next; 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) { 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(tmp); 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(tmp); 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) { 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name2 = xmlGetProp(tmp, BAD_CAST "name"); 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(name2); 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name2 != NULL) { 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, name2)) { 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(tmp); 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(tmp); 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name2); 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(tmp, "include")) { 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href = NULL; 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr inc = tmp->psvi; 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((inc != NULL) && (inc->doc != NULL) && 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (inc->doc->children != NULL)) { 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (inc->doc->children->name, BAD_CAST "grammar")) { 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetProp(tmp, BAD_CAST "href"); 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGRemoveRedefine(ctxt, href, 1565df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlDocGetRootElement(inc->doc)->children, 1566df143a5041f03a22808b59c76698770b74692815Selim Gurun name) == 1) { 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp2; 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (found); 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadInclude: 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the normalized URL 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the include node. 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace passed from the context. 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context, 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller. 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGIncludePtr or NULL in case of error 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL, 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, const xmlChar * ns) 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr ret = NULL; 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root, cur; 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGLoadInclude(%s)\n", URL); 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion in the stack 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->incNr; i++) { 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->incTab[i]->href, URL)) { 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_INCLUDE_RECURSE, 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Detected an Include recursion for %s\n", URL, 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * load the document 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) URL,NULL,0); 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARSE_ERROR, 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: could not load %s\n", URL, NULL); 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL); 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the document structures and register it first. 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude)); 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating include\n"); 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGInclude)); 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->href = xmlStrdup(URL); 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = ctxt->includes; 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes = ret; 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transmit the ns if needed 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != NULL) { 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHasProp(root, BAD_CAST "ns") == NULL) { 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(root, BAD_CAST "ns", ns); 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * push it on the stack 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePush(ctxt, ret); 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some preprocessing of the document content, this include recursing 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the include stack. 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL); 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlRelaxNGCleanupDoc(ctxt, doc); 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = NULL; 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop up the include from the stack 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePop(ctxt); 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL); 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that the top element is a grammar 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: included document is empty %s\n", URL, 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_RELAXNG(root, "grammar")) { 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: included document %s root is not a grammar\n", 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, NULL); 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Elimination of redefined rules in the include. 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node->children; 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(cur, "start")) { 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL); 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!found) { 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_START_MISSING, 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: include %s has a start but not the included grammar\n", 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, NULL); 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(cur, "define")) { 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlGetProp(cur, BAD_CAST "name"); 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_NAME_MISSING, 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: include %s has define without name\n", 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, NULL); 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found; 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(name); 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = xmlRelaxNGRemoveRedefine(ctxt, URL, 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root->children, name); 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!found) { 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_MISSING, 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: include %s has a define %s but not the included grammar\n", 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, name); 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPush: 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error code 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first string argument 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second string argument 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup: arg need to be duplicated 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new error on top of the error stack 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt, 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err, const xmlChar * arg1, 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2, int dup) 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr cur; 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Pushing error %d at %d on stack\n", err, ctxt->errNr); 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab == NULL) { 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errMax = 8; 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr = 0; 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errTab = 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidErrorPtr) xmlMalloc(ctxt->errMax * 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidError)); 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab == NULL) { 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "pushing error\n"); 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr >= ctxt->errMax) { 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errMax *= 2; 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errTab = 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab, 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errMax * 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidError)); 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab == NULL) { 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "pushing error\n"); 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->err != NULL) && (ctxt->state != NULL) && 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err)) 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->errNr); 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &ctxt->errTab[ctxt->errNr]; 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->err = err; 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dup) { 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg1 = xmlStrdup(arg1); 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg2 = xmlStrdup(arg2); 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = ERROR_IS_DUP; 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg1 = arg1; 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg2 = arg2; 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = 0; 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->node = ctxt->state->node; 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->seq = ctxt->state->seq; 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->node = NULL; 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->seq = NULL; 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = cur; 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->errNr++); 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPop: 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top error from the error stack 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt) 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr cur; 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr <= 0) { 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr--; 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &ctxt->errTab[ctxt->errNr]; 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->flags & ERROR_IS_DUP) { 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->arg1 != NULL) 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) cur->arg1); 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg1 = NULL; 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->arg2 != NULL) 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) cur->arg2); 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg2 = NULL; 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = 0; 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPush: 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the element doc 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new doc on top of the doc stack 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt, 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr value) 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab == NULL) { 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docMax = 4; 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docNr = 0; 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab = 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGDocumentPtr *) xmlMalloc(ctxt->docMax * 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->docTab[0])); 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab == NULL) { 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "adding document\n"); 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docNr >= ctxt->docMax) { 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docMax *= 2; 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab = 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGDocumentPtr *) xmlRealloc(ctxt->docTab, 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docMax * 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->docTab[0])); 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab == NULL) { 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "adding document\n"); 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab[ctxt->docNr] = value; 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = value; 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->docNr++); 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPop: 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top doc from the doc stack 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the doc just removed 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt) 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr ret; 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docNr <= 0) 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docNr--; 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docNr > 0) 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = ctxt->docTab[ctxt->docNr - 1]; 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = NULL; 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->docTab[ctxt->docNr]; 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab[ctxt->docNr] = NULL; 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadExternalRef: 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the normalized URL 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the inherited ns if any 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context, 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller. 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDocumentPtr or NULL in case of error 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt, 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * URL, const xmlChar * ns) 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr ret = NULL; 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion in the stack 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->docNr; i++) { 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->docTab[i]->href, URL)) { 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE, 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Detected an externalRef recursion for %s\n", URL, 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * load the document 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) URL,NULL,0); 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: could not load %s\n", URL, NULL); 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the document structures and register it first. 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument)); 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY, 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL); 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGDocument)); 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->href = xmlStrdup(URL); 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = ctxt->documents; 1976df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->externalRef = 1; 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->documents = ret; 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transmit the ns if needed 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != NULL) { 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHasProp(root, BAD_CAST "ns") == NULL) { 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(root, BAD_CAST "ns", ns); 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * push it on the stack and register it in the hash table 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPush(ctxt, ret); 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some preprocessing of the document content 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlRelaxNGCleanupDoc(ctxt, doc); 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = NULL; 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPop(ctxt); 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 201194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 201294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Error functions * 201394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0); 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0); 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0); 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1); 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1); 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char * 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefName(xmlRelaxNGDefinePtr def) 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("none"); 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("empty"); 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("notAllowed"); 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("except"); 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("text"); 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("element"); 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("datatype"); 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("value"); 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("list"); 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("attribute"); 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("def"); 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("ref"); 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("externalRef"); 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("parentRef"); 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("optional"); 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("zeroOrMore"); 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("oneOrMore"); 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("choice"); 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("group"); 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("interleave"); 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("start"); 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("noop"); 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("param"); 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("unknown"); 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetErrorString: 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error code 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first string argument 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second string argument 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computes a formatted error string for the given error code and args 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the error string, it must be deallocated by the caller 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1, 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2) 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char msg[1000]; 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 == NULL) 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = BAD_CAST ""; 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2 == NULL) 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = BAD_CAST ""; 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg[0] = 0; 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (err) { 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OK: 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_MEMORY: 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("out of memory\n")); 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TYPE: 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "failed to validate type %s\n", arg1); 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TYPEVAL: 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1, 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2); 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_DUPID: 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "ID %s redefined\n", arg1); 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TYPECMP: 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "failed to compare type %s\n", arg1); 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOSTATE: 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Internal error: no state\n")); 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NODEFINE: 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Internal error: no define\n")); 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTERNAL: 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Internal error: %s\n", arg1); 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LISTEXTRA: 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Extra data in list: %s\n", arg1); 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTERNODATA: 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ("Internal: interleave block has no data\n")); 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTERSEQ: 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Invalid sequence in interleave\n")); 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTEREXTRA: 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Extra element %s in interleave\n", arg1); 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMNAME: 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1, 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2); 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMNONS: 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting a namespace for element %s\n", 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMWRONGNS: 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has wrong namespace: expecting %s\n", arg1, 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2); 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMWRONG: 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Did not expect element %s there\n", arg1); 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TEXTWRONG: 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Did not expect text in element %s content\n", arg1); 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMEXTRANS: 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting no namespace for element %s\n", 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMNOTEMPTY: 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1); 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOELEM: 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting an element %s, got nothing\n", 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOTELEM: 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Expecting an element got text\n")); 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ATTRVALID: 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Element %s failed to validate attributes\n", 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_CONTENTVALID: 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Element %s failed to validate content\n", 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_EXTRACONTENT: 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Element %s has extra content: %s\n", 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1, arg2); 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INVALIDATTR: 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Invalid attribute %s for element %s\n", 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1, arg2); 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LACKDATA: 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Datatype element %s contains no data\n", 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_DATAELEM: 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Datatype element %s has child elements\n", 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_VALELEM: 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Value element %s has child elements\n", 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LISTELEM: 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "List element %s has child elements\n", 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_DATATYPE: 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Error validating datatype %s\n", arg1); 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_VALUE: 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Error validating value %s\n", arg1); 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LIST: 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Error validating list\n")); 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOGRAMMAR: 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("No top grammar defined\n")); 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_EXTRADATA: 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Extra data in the document\n")); 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Unknown error !\n")); 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (msg[0] == 0) { 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Unknown error code %d\n", err); 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg[1000 - 1] = 0; 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStrdup((xmlChar *) msg)); 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGShowValidError: 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error number 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child: the node child generating the problem. 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first argument 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second argument 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show a validation error. 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err, xmlNodePtr node, 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child, const xmlChar * arg1, 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2) 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *msg; 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & FLAGS_NOERROR) 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err); 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = xmlRelaxNGGetErrorString(err, arg1, arg2); 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (msg == NULL) 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_RELAXNG_OK) 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = err; 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErr(ctxt, (child == NULL ? node : child), err, 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) msg, arg1, arg2); 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(msg); 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPopErrors: 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @level: the error level in the stack 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pop and discard all errors until the given level is reached 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level) 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr err; 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Pop errors till level %d\n", level); 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = level; i < ctxt->errNr; i++) { 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err = &ctxt->errTab[i]; 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->flags & ERROR_IS_DUP) { 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg1 != NULL) 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg1); 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg1 = NULL; 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg2 != NULL) 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg2); 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg2 = NULL; 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->flags = 0; 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr = level; 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr <= 0) 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpValidError: 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show all validation error over a given index. 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt) 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, k; 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr err, dup; 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Dumping error stack %d errors\n", ctxt->errNr); 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0, k = 0; i < ctxt->errNr; i++) { 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err = &ctxt->errTab[i]; 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (k < MAX_ERROR) { 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < i; j++) { 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dup = &ctxt->errTab[j]; 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((err->err == dup->err) && (err->node == dup->node) && 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(err->arg1, dup->arg1)) && 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(err->arg2, dup->arg2))) { 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip; 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq, 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg1, err->arg2); 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project k++; 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip: 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->flags & ERROR_IS_DUP) { 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg1 != NULL) 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg1); 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg1 = NULL; 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg2 != NULL) 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg2); 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg2 = NULL; 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->flags = 0; 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr = 0; 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddValidError: 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error number 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first argument 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second argument 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup: need to dup the args 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a validation error, either generating it if it's sure 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or stacking it for later handling if unsure. 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err, const xmlChar * arg1, 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2, int dup) 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & FLAGS_NOERROR) 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err); 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * generate the error directly 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((ctxt->flags & FLAGS_IGNORABLE) == 0) || 236494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun (ctxt->flags & FLAGS_NEGATIVE)) { 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, seq; 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Flush first any stacked error which might be the 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * real cause of the problem. 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr != 0) 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ctxt->state->node; 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = ctxt->state->seq; 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = seq = NULL; 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2379df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((node == NULL) && (seq == NULL)) { 2380df143a5041f03a22808b59c76698770b74692815Selim Gurun node = ctxt->pnode; 2381df143a5041f03a22808b59c76698770b74692815Selim Gurun } 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2); 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Stack the error for later processing if needed 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup); 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 239494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 239594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Type library hooks * 239694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * str); 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeHave: 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library. 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type) 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NULL) 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCheck: 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library. 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED, 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value, 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **result, xmlNodePtr node) 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == NULL) || (value == NULL)) 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValPredefTypeNode(typ, value, 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlSchemaValPtr *) result, node); 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 2) /* special ID error code */ 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (2); 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret > 0) 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFacetCheck: 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the facet name 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the facet value 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval: the string value 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED, 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, const xmlChar * facetname, 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * val, const xmlChar * strval, 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *value) 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFacetPtr facet; 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == NULL) || (strval == NULL)) 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet = xmlSchemaNewFacet(); 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (facet == NULL) 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) { 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MININCLUSIVE; 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) { 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) { 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) { 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) { 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_TOTALDIGITS; 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) { 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) { 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_PATTERN; 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) { 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_ENUMERATION; 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) { 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_WHITESPACE; 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "length")) { 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_LENGTH; 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) { 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MAXLENGTH; 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) { 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MINLENGTH; 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeFacet(facet); 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->value = val; 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaCheckFacet(facet, typ, NULL, type); 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeFacet(facet); 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValidateFacet(typ, facet, strval, value); 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeFacet(facet); 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFreeValue: 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to free 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a Schemas value 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value) 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(value); 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCompare: 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1: the first value 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values for equality accordingly a type from the W3C XMLSchema 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Datatype library. 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equal, 0 if no and -1 in case of error. 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value1, 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt1, 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *comp1, 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value2, xmlNodePtr ctxt2) 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaValPtr res1 = NULL, res2 = NULL; 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == NULL) || (value1 == NULL) || (value2 == NULL)) 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp1 == NULL) { 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1); 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res1 == NULL) 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res1 = (xmlSchemaValPtr) comp1; 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp1 == NULL) && (res1 != NULL)) 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(res1); 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res1 == NULL) { 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaCompareValues(res1, res2); 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res1 != (xmlSchemaValPtr) comp1) 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(res1); 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(res2); 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -2) 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeHave: 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library. 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED, 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type) 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NULL) 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "string")) 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "token")) 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCheck: 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library. 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED, 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type ATTRIBUTE_UNUSED, 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value ATTRIBUTE_UNUSED, 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **result ATTRIBUTE_UNUSED, 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node ATTRIBUTE_UNUSED) 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "string")) 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "token")) { 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCompare: 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1: the first value 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values accordingly a type from the default 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * datatype library. 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED, 2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value1, 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt1 ATTRIBUTE_UNUSED, 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *comp1 ATTRIBUTE_UNUSED, 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value2, 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt2 ATTRIBUTE_UNUSED) 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = -1; 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "string")) { 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(value1, value2); 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(type, BAD_CAST "token")) { 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(value1, value2)) { 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *nval, *nvalue; 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: trivial optimizations are possible by 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computing at compile-time 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nval = xmlRelaxNGNormalize(NULL, value1); 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nvalue = xmlRelaxNGNormalize(NULL, value2); 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nval == NULL) || (nvalue == NULL)) 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(nval, nvalue)) 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nval != NULL) 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nval); 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nvalue != NULL) 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nvalue); 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTypeInitialized = 0; 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL; 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeTypeLibrary: 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lib: the type library structure 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace: the URI bound to the library 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structure associated to the type library 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib, 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * namespace ATTRIBUTE_UNUSED) 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->namespace != NULL) 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) lib->namespace); 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(lib); 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRegisterTypeLibrary: 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace: the URI bound to the library 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the library 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @have: the provide function 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @check: the checking function 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the comparison function 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new type library 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data, 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeHave have, 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCheck check, 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCompare comp, 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFacetCheck facet, 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeFree freef) 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) || 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (check == NULL) || (comp == NULL)) 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) { 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Relax-NG types library '%s' already registered\n", 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespace); 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGTypeLibraryPtr) 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGTypeLibrary)); 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) { 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(NULL, "adding types library\n"); 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(lib, 0, sizeof(xmlRelaxNGTypeLibrary)); 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->namespace = xmlStrdup(namespace); 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->data = data; 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->have = have; 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->comp = comp; 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->check = check; 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->facet = facet; 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef = freef; 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib); 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Relax-NG types library failed to register '%s'\n", 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespace); 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeTypeLibrary(lib, namespace); 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInitTypes: 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initilize the default type libraries. 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGInitTypes(void) 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGTypeInitialized != 0) 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRegisteredTypes = xmlHashCreate(10); 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGRegisteredTypes == NULL) { 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to allocate sh table for Relax-NG types\n"); 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRegisterTypeLibrary(BAD_CAST 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema-datatypes", 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, xmlRelaxNGSchemaTypeHave, 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaTypeCheck, 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaTypeCompare, 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaFacetCheck, 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaFreeValue); 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs, NULL, 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefaultTypeHave, 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefaultTypeCheck, 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefaultTypeCompare, NULL, 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeInitialized = 1; 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTypes: 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the default Schemas type library associated to RelaxNG 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTypes(void) 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaCleanupTypes(); 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGTypeInitialized == 0) 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator) 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeTypeLibrary); 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeInitialized = 0; 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 285194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 285294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Compiling element content into regexp * 285394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sometime the element content can be compiled into a pure regexp, * 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This allows a faster execution and streamability at that level * 285694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2859df143a5041f03a22808b59c76698770b74692815Selim Gurun/* from automata.c but not exported */ 2860df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags); 2861df143a5041f03a22808b59c76698770b74692815Selim Gurun 2862df143a5041f03a22808b59c76698770b74692815Selim Gurun 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def); 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsCompileable: 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to check 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable. 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsCompileable(xmlRelaxNGDefinePtr def) 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = -1; 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type != XML_RELAXNG_ELEMENT) && 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->dflags & IS_COMPILABLE)) 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type != XML_RELAXNG_ELEMENT) && 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->dflags & IS_NOT_COMPILABLE)) 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(def->content); 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the element content is compileable 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((def->dflags & IS_NOT_COMPILABLE) == 0) && 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((def->dflags & IS_COMPILABLE) == 0)) { 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(list); 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Because the routine is recursive, we must guard against 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * discovering both COMPILABLE and NOT_COMPILABLE 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags &= ~IS_COMPILABLE; 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_NOT_COMPILABLE; 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE)) 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_COMPILABLE; 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element content for %s is compilable\n", 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element content for %s is not compilable\n", 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Problem in RelaxNGIsCompileable for element %s\n", 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All elements return a compileable status unless they 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are generic like anyName 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->nameClass != NULL) || (def->name == NULL)) 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->depth == -20) { 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->depth = -20; 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(list); 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF:{ 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(list); 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_NOT_COMPILABLE; 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_COMPILABLE; 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RelaxNGIsCompileable %s : true\n", 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RelaxNGIsCompileable %s : false\n", 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Problem in RelaxNGIsCompileable %s\n", 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompile: 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt: the RelaxNG parser context 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition tree to compile 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the set of definitions, it works recursively, till the 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element boundaries, where it tries to compile the content if possible 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (def == NULL)) 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) { 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr oldam = ctxt->am; 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->depth = -25; 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = xmlNewAutomata(); 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->am == NULL) 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3046df143a5041f03a22808b59c76698770b74692815Selim Gurun 3047df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 3048df143a5041f03a22808b59c76698770b74692815Selim Gurun * assume identical strings but not same pointer are different 3049df143a5041f03a22808b59c76698770b74692815Selim Gurun * atoms, needed for non-determinism detection 3050df143a5041f03a22808b59c76698770b74692815Selim Gurun * That way if 2 elements with the same name are in a choice 3051df143a5041f03a22808b59c76698770b74692815Selim Gurun * branch the automata is found non-deterministic and 3052df143a5041f03a22808b59c76698770b74692815Selim Gurun * we fallback to the normal validation which does the right 3053df143a5041f03a22808b59c76698770b74692815Selim Gurun * thing of exploring both choices. 3054df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 3055df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAutomataSetFlags(ctxt->am, 1); 3056df143a5041f03a22808b59c76698770b74692815Selim Gurun 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataGetInitState(ctxt->am); 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataSetFinalState(ctxt->am, ctxt->state); 306394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (xmlAutomataIsDeterminist(ctxt->am)) 306494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun def->contModel = xmlAutomataCompile(ctxt->am); 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt->am); 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = oldam; 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->am != NULL) && (def->name != NULL)) { 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewTransition2(ctxt->am, 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL, 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, def->ns, 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def); 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr oldam = ctxt->am; 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->depth = -25; 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = xmlNewAutomata(); 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->am == NULL) 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3088df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAutomataSetFlags(ctxt->am, 1); 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataGetInitState(ctxt->am); 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataSetFinalState(ctxt->am, ctxt->state); 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->contModel = xmlAutomataCompile(ctxt->am); 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlRegexpIsDeterminist(def->contModel)) { 3097df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef DEBUG_COMPILE 3098df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 3099df143a5041f03a22808b59c76698770b74692815Selim Gurun "Content model not determinist %s\n", 3100df143a5041f03a22808b59c76698770b74692815Selim Gurun def->name); 3101df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we can only use the automata if it is determinist 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRegexp(def->contModel); 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->contModel = NULL; 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt->am); 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = oldam; 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr oldam = ctxt->am; 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we can't build the content model for this element content 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * but it still might be possible to build it for some of its 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * children, recurse. 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGTryCompile(ctxt, def); 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = oldam; 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, def->content); 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL:{ 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3129df143a5041f03a22808b59c76698770b74692815Selim Gurun list = def->content; 3130df143a5041f03a22808b59c76698770b74692815Selim Gurun while (list != NULL) { 3131df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGCompile(ctxt, list); 3132df143a5041f03a22808b59c76698770b74692815Selim Gurun list = list->next; 3133df143a5041f03a22808b59c76698770b74692815Selim Gurun } 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE:{ 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate; 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE:{ 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate; 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr target = NULL; 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, list); 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target == NULL) 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = ctxt->state; 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target); 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = target; 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, list); 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT:{ 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate; 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, def->content); 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewTransition(ctxt->am, ctxt->state, 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, BAD_CAST "#text", 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* This should not happen and generate an internal error */ 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "RNG internal error trying to compile %s\n", 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryCompile: 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt: the RelaxNG parser context 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition tree to compile 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the set of definitions, it works recursively, 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possibly ignoring parts which cannot be compiled. 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (def == NULL)) 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type == XML_RELAXNG_START) || 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type == XML_RELAXNG_ELEMENT)) { 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(def); 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = NULL; 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, def); 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->type == XML_RELAXNG_START) 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "compiled the start\n"); 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "compiled element %s\n", def->name); 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->type == XML_RELAXNG_START) 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to compile the start\n"); 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to compile element %s\n", 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGTryCompile(ctxt, def->content); 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGTryCompile(ctxt, list); 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 332994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 333094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Parsing functions * 333194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node); 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node); 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr nodes, 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int group); 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node); 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node); 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr nodes); 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node, 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def); 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr nodes); 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem); 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content)) 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsNullable: 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable. 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsNullable(xmlRelaxNGDefinePtr define) 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->dflags & IS_NULLABLE) 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->dflags & IS_NOT_NULLABLE) 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsNullable(define->content); 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsNullable(list); 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP:{ 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsNullable(list); 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project done: 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->dflags |= IS_NOT_NULLABLE; 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->dflags |= IS_NULLABLE; 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsBlank: 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: a string 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a string is ignorable c.f. 4.2. Whitespace 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsBlank(xmlChar * str) 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) 3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*str != 0) { 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(IS_BLANK_CH(*str))) 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str++; 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetDataTypeLibrary: 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current data or value element 3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies algorithm from 4.3. datatypeLibrary attribute 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the datatypeLibary value or NULL if not found 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node) 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret, *escape; 3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3475df143a5041f03a22808b59c76698770b74692815Selim Gurun if (node == NULL) 3476df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 3477df143a5041f03a22808b59c76698770b74692815Selim Gurun 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) { 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret[0] == 0) { 3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (escape == NULL) { 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (escape); 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) { 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret[0] == 0) { 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (escape == NULL) { 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (escape); 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseValue: 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the data node. 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG value node. 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL; 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib = NULL; 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *type; 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *library; 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int success = 0; 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_VALUE; 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = xmlGetProp(node, BAD_CAST "type"); 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type != NULL) { 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(type); 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(type, 0)) { 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "value type '%s' is not an NCName\n", type, NULL); 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (library == NULL) 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = type; 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->ns = library; 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(xmlRelaxNGRegisteredTypes, library); 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) { 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Use of unregistered type library '%s'\n", library, 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = NULL; 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = lib; 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->have == NULL) { 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error with type library '%s': no 'have'\n", 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library, NULL); 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project success = lib->have(lib->data, def->name); 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (success != 1) { 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error type '%s' is not exported by type library '%s'\n", 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, library); 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->value = xmlStrdup(BAD_CAST ""); 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((node->children->type != XML_TEXT_NODE) && 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->children->type != XML_CDATA_SECTION_NODE)) || 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->children->next != NULL)) { 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TEXT_EXPECTED, 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting a single text value for <value>content\n", 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def != NULL) { 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->value = xmlNodeGetContent(node); 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->value == NULL) { 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_VALUE_NO_CONTENT, 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element <value> has no content\n", NULL, NULL); 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) { 3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *val = NULL; 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project success = 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->check(lib->data, def->name, def->value, &val, node); 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (success != 1) { 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INVALID_VALUE, 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value '%s' is not acceptable for type '%s'\n", 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->value, def->name); 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->attrs = val; 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseData: 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the data node. 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG data node. 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL, except; 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr param, lastparam = NULL; 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *type; 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *library; 3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr content; 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = xmlGetProp(node, BAD_CAST "type"); 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NULL) { 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL, 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(type); 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(type, 0)) { 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, 3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "data type '%s' is not an NCName\n", type, NULL); 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (library == NULL) 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(type); 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_DATATYPE; 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = type; 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->ns = library; 3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(xmlRelaxNGRegisteredTypes, library); 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) { 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Use of unregistered type library '%s'\n", library, 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = NULL; 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = lib; 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->have == NULL) { 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error with type library '%s': no 'have'\n", 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library, NULL); 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = lib->have(lib->data, def->name); 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 1) { 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error type '%s' is not exported by type library '%s'\n", 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, library); 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (library, 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema-datatypes")) 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && ((xmlStrEqual(def->name, BAD_CAST "IDREF")) 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || (xmlStrEqual(def->name, BAD_CAST "IDREFS")))) { 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->idref = 1; 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = node->children; 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle optional params 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (content != NULL) { 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(content->name, BAD_CAST "param")) 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(library, 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "http://relaxng.org/ns/structure/1.0")) { 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARAM_FORBIDDEN, 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Type library '%s' does not allow type parameters\n", 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library, NULL); 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((content != NULL) && 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(content->name, BAD_CAST "param"))) 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param = xmlRelaxNGNewDefine(ctxt, node); 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (param != NULL) { 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param->type = XML_RELAXNG_PARAM; 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param->name = xmlGetProp(content, BAD_CAST "name"); 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (param->name == NULL) { 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING, 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "param has no name\n", NULL, NULL); 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param->value = xmlNodeGetContent(content); 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lastparam == NULL) { 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->attrs = lastparam = param; 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastparam->next = param; 3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastparam = param; 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib != NULL) { 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle optional except 3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content != NULL) 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(content->name, BAD_CAST "except"))) { 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr tmp2, last = NULL; 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project except = xmlRelaxNGNewDefine(ctxt, node); 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (except == NULL) { 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project except->type = XML_RELAXNG_EXCEPT; 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = content->children; 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = except; 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT, 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "except has no content\n", NULL, NULL); 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlRelaxNGParsePattern(ctxt, child); 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 != NULL) { 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project except->content = last = tmp2; 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp2; 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp2; 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check there is no unhandled data 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) { 3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, content, XML_RNGP_DATA_CONTENT, 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element data has unexpected content %s\n", 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content->name, NULL); 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *invalidName = BAD_CAST "\1"; 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareNameClasses: 3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1: the first element/attribute defs 3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2: the second element/attribute defs 3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the restriction on the name 3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the restriction on the namespace 3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element definitions. The comparison is 3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that if both lists do not accept the same QNames, it returns 1 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1, 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def2) 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode node; 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNs ns; 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxt ctxt; 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt)); 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR; 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def1->type == XML_RELAXNG_ELEMENT) || 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def1->type == XML_RELAXNG_ATTRIBUTE)) { 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->type == XML_RELAXNG_TEXT) 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->name != NULL) { 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = def1->name; 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = invalidName; 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->ns != NULL) { 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->ns[0] == 0) { 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = NULL; 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = &ns; 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.href = def1->ns; 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = NULL; 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGElementMatch(&ctxt, def2, &node)) { 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->nameClass != NULL) { 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2); 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def1->type == XML_RELAXNG_TEXT) { 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->type == XML_RELAXNG_TEXT) 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def1->type == XML_RELAXNG_EXCEPT) { 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = 0; 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = 0; 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def2->type == XML_RELAXNG_ELEMENT) || 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def2->type == XML_RELAXNG_ATTRIBUTE)) { 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->name != NULL) { 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = def2->name; 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = invalidName; 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = &ns; 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->ns != NULL) { 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->ns[0] == 0) { 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = NULL; 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.href = def2->ns; 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.href = invalidName; 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGElementMatch(&ctxt, def1, &node)) { 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->nameClass != NULL) { 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1); 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = 0; 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareElemDefLists: 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1: the first list of element/attribute defs 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2: the second list of element/attribute defs 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element or attribute definitions. The comparison 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is that if both lists do not accept the same QNames, it returns 1 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ATTRIBUTE_UNUSED, xmlRelaxNGDefinePtr * def1, 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr * def2) 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *basedef2 = def2; 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def1 == NULL) || (def2 == NULL)) 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*def1 == NULL) || (*def2 == NULL)) 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*def1 != NULL) { 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*def2) != NULL) { 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0) 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def2++; 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def2 = basedef2; 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def1++; 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGenerateAttributes: 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the definition definition 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the definition can only generate attributes 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt, 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr parent, cur, tmp; 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = NULL; 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def; 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_ELEMENT) || 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_TEXT) || 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_DATATYPE) || 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARAM) || 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_LIST) || 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_VALUE) || 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_EMPTY)) 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_CHOICE) || 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_INTERLEAVE) || 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_GROUP) || 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ONEORMORE) || 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ZEROORMORE) || 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_OPTIONAL) || 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF) || 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_EXTERNALREF) || 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_REF) || 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_DEF)) { 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = cur; 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur; 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->parent = parent; 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetElements: 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the definition definition 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @eora: gather elements (0) or attributes (1) 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the list of top elements a definition can generate 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a list of elements or NULL if none was found. 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr * 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt, 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def, int eora) 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *ret = NULL, parent, cur, tmp; 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0; 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max = 0; 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = NULL; 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def; 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) || 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_TEXT))) || 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) { 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = 10; 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGDefinePtr *) 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr)); 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "getting element list\n"); 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (max <= len) { 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *temp; 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max *= 2; 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = xmlRealloc(ret, 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (max + 1) * sizeof(xmlRelaxNGDefinePtr)); 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "getting element list\n"); 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = temp; 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret[len++] = cur; 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret[len] = NULL; 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->type == XML_RELAXNG_CHOICE) || 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_INTERLEAVE) || 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_GROUP) || 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ONEORMORE) || 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ZEROORMORE) || 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_OPTIONAL) || 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF) || 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_REF) || 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_DEF) || 4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_EXTERNALREF)) { 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't go within elements or attributes or string values. 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Just gather the element top list 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = cur; 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur; 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->parent = parent; 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckChoiceDeterminism: 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the choice definition 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also used to find indeterministic pattern in choice 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt, 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr **list; 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchild = 0, i, j, ret; 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_nullable = 0; 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_indeterminist = 0; 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr triage = NULL; 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_triable = 1; 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE)) 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->dflags & IS_PROCESSED) 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_nullable = xmlRelaxNGIsNullable(def); 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRelaxNGDefinePtr 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *)); 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "building choice\n"); 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a bit strong but safe 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_nullable == 0) { 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project triage = xmlHashCreate(10); 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = 0; 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = xmlRelaxNGGetElements(ctxt, cur, 0); 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((list[i] == NULL) || (list[i][0] == NULL)) { 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = 0; 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (is_triable == 1) { 4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *tmp; 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = list[i]; 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*tmp != NULL) && (is_triable == 1)) { 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*tmp)->type == XML_RELAXNG_TEXT) { 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#text", NULL, 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*tmp)->name != NULL)) { 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, NULL, 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, (*tmp)->ns, 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", NULL, 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", (*tmp)->ns, 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp++; 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] == NULL) 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < i; j++) { 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[j] == NULL) 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_indeterminist = 1; 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] != NULL) 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list[i]); 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_indeterminist) { 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_INDETERMINIST; 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_triable == 1) { 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_TRIABLE; 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = triage; 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (triage != NULL) { 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(triage, NULL); 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_PROCESSED; 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckGroupAttrs: 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the group definition 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Detects violations of rule 7.3 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt, 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr **list; 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchild = 0, i, j, ret; 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def == NULL) || 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((def->type != XML_RELAXNG_GROUP) && 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type != XML_RELAXNG_ELEMENT))) 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->dflags & IS_PROCESSED) 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->attrs; 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRelaxNGDefinePtr 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *)); 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "building group\n"); 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->attrs; 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] == NULL) 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < i; j++) { 4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[j] == NULL) 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT, 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attributes conflicts in group\n", NULL, NULL); 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] != NULL) 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list[i]); 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_PROCESSED; 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGComputeInterleaves: 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the interleave definition 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the definition name 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A lot of work for preprocessing interleave definitions 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is potentially needed to get a decent execution speed at runtime 4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - trying to get a total order on the element nodes generated 4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the interleaves, order the list of interleave definitions 4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * following that order. 4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - if <text/> is used to handle mixed content, it is better to 4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flag this in the define and simplify the runtime checking 4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * algorithm 4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def, 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ctxt, 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar * name ATTRIBUTE_UNUSED) 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, *tmp; 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPartitionPtr partitions = NULL; 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr *groups = NULL; 4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr group; 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, ret, res; 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbgroups = 0; 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchild = 0; 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_mixed = 0; 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_determinist = 1; 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGComputeInterleaves(%s)\n", name); 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " %d child\n", nbchild); 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups = (xmlRelaxNGInterleaveGroupPtr *) 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr)); 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups == NULL) 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr) 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup)); 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[nbgroups] == NULL) 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_RELAXNG_TEXT) 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_mixed++; 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups]->rule = cur; 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0); 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1); 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbgroups++; 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " %d groups\n", nbgroups); 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Let's check that all rules makes a partitions according to 7.4 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions = (xmlRelaxNGPartitionPtr) 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGPartition)); 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions == NULL) 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(partitions, 0, sizeof(xmlRelaxNGPartition)); 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->nbgroups = nbgroups; 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->triage = xmlHashCreate(nbgroups); 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) { 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = groups[i]; 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = i + 1; j < nbgroups; j++) { 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[j] == NULL) 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs, 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[j]->defs); 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT, 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element or text conflicts in interleave\n", 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs, 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[j]->attrs); 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT, 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attributes conflicts in interleave\n", NULL, 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = group->defs; 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && (*tmp != NULL)) { 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*tmp != NULL) { 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*tmp)->type == XML_RELAXNG_TEXT) { 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#text", NULL, 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && 4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*tmp)->name != NULL)) { 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, NULL, 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, (*tmp)->ns, 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", NULL, 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", (*tmp)->ns, 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*tmp)->nameClass != NULL) 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = 2; 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp++; 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = 0; 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->groups = groups; 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and save the partition list back in the def 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = partitions; 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_mixed != 0) 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_MIXED; 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_determinist == 1) 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->flags = IS_DETERMINIST; 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_determinist == 2) 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->flags = IS_DETERMINIST | IS_NEEDCHECK; 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error: 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "in interleave computation\n"); 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups != NULL) { 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[i] != NULL) { 4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[i]->defs != NULL) 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(groups[i]->defs); 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(groups[i]); 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(groups); 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreePartition(partitions); 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInterleave: 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the data node. 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG interleave node. 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error 4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL; 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr last = NULL, cur; 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_INTERLEAVE; 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->interleaves = xmlHashCreate(10); 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) { 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "create interleaves\n"); 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char name[32]; 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++); 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) { 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_ADD, 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to add %s to hash table\n", 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) name, NULL); 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT, 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element interleave is empty\n", NULL, NULL); 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(child, "element")) { 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseElement(ctxt, child); 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, child); 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = def; 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = last = cur; 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInclude: 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the include node 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Integrate the content of an include node in the current grammar 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr incl; 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, tmp; 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project incl = node->psvi; 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl == NULL) { 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INCLUDE_EMPTY, 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Include node has no data\n", NULL, NULL); 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(incl->doc); 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n", 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(root->name, BAD_CAST "grammar")) { 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Include document root is not a grammar\n", NULL, NULL); 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merge the definition from both the include and the internal list 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root->children != NULL) { 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children); 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children); 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDefine: 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the define node 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG define element node. 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, tmp; 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *olddefine; 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlGetProp(node, BAD_CAST "name"); 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING, 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "define has no name\n", NULL, NULL); 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(name); 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(name, 0)) { 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME, 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "define name '%s' is not an NCName\n", name, NULL); 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_DEF; 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = name; 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_EMPTY, 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "define has no children\n", NULL, NULL); 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project olddefine = ctxt->define; 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = name; 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = olddefine; 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->defs == NULL) 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->defs = xmlHashCreate(10); 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->defs == NULL) { 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not create definition hash\n", NULL, NULL); 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def); 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) { 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev; 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlHashLookup(ctxt->grammar->defs, name); 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL) { 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error on define aggregation of %s\n", 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev->nextHash != NULL) 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->nextHash; 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->nextHash = def; 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4654df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRef: 4655df143a5041f03a22808b59c76698770b74692815Selim Gurun * @payload: the parser context 4656df143a5041f03a22808b59c76698770b74692815Selim Gurun * @data: the current grammar 4657df143a5041f03a22808b59c76698770b74692815Selim Gurun * @name: the reference name 4658df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4659df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import import one references into the current grammar 4660df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4661df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 4662df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRef(void *payload, void *data, xmlChar *name) { 4663df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr) data; 4664df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload; 4665df143a5041f03a22808b59c76698770b74692815Selim Gurun int tmp; 4666df143a5041f03a22808b59c76698770b74692815Selim Gurun 4667df143a5041f03a22808b59c76698770b74692815Selim Gurun def->dflags |= IS_EXTERNAL_REF; 4668df143a5041f03a22808b59c76698770b74692815Selim Gurun 4669df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp = xmlHashAddEntry(ctxt->grammar->refs, name, def); 4670df143a5041f03a22808b59c76698770b74692815Selim Gurun if (tmp < 0) { 4671df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGDefinePtr prev; 4672df143a5041f03a22808b59c76698770b74692815Selim Gurun 4673df143a5041f03a22808b59c76698770b74692815Selim Gurun prev = (xmlRelaxNGDefinePtr) 4674df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlHashLookup(ctxt->grammar->refs, def->name); 4675df143a5041f03a22808b59c76698770b74692815Selim Gurun if (prev == NULL) { 4676df143a5041f03a22808b59c76698770b74692815Selim Gurun if (def->name != NULL) { 4677df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 4678df143a5041f03a22808b59c76698770b74692815Selim Gurun "Error refs definitions '%s'\n", 4679df143a5041f03a22808b59c76698770b74692815Selim Gurun def->name, NULL); 4680df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 4681df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 4682df143a5041f03a22808b59c76698770b74692815Selim Gurun "Error refs definitions\n", 4683df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL, NULL); 4684df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4685df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 4686df143a5041f03a22808b59c76698770b74692815Selim Gurun def->nextHash = prev->nextHash; 4687df143a5041f03a22808b59c76698770b74692815Selim Gurun prev->nextHash = def; 4688df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4689df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4690df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4691df143a5041f03a22808b59c76698770b74692815Selim Gurun 4692df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4693df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRefs: 4694df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: the parser context 4695df143a5041f03a22808b59c76698770b74692815Selim Gurun * @grammar: the sub grammar 4696df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4697df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import references from the subgrammar into the current grammar 4698df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4699df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of success, -1 in case of failure 4700df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4701df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 4702df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRefs(xmlRelaxNGParserCtxtPtr ctxt, 4703df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGGrammarPtr grammar) { 4704df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt == NULL) || (grammar == NULL) || (ctxt->grammar == NULL)) 4705df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 4706df143a5041f03a22808b59c76698770b74692815Selim Gurun if (grammar->refs == NULL) 4707df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 4708df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->grammar->refs == NULL) 4709df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->grammar->refs = xmlHashCreate(10); 4710df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->grammar->refs == NULL) { 4711df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 4712df143a5041f03a22808b59c76698770b74692815Selim Gurun "Could not create references hash\n", NULL, NULL); 4713df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 4714df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4715df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlHashScan(grammar->refs, xmlRelaxNGParseImportRef, ctxt); 4716df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 4717df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4718df143a5041f03a22808b59c76698770b74692815Selim Gurun 4719df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGProcessExternalRef: 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the externlRef node 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process and compile an externlRef node 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDefinePtr or NULL in case of error 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr docu; 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root, tmp; 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns; 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newNs = 0, oldflags; 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu = node->psvi; 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu != NULL) { 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_EXTERNALREF; 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->content == NULL) { 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then do the parsing for good 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(docu->doc); 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXTERNALREF_EMTPY, 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: %s is empty\n", ctxt->URL, 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ns transmission rules 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(root, BAD_CAST "ns"); 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = node; 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) { 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(tmp, BAD_CAST "ns"); 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(root, BAD_CAST "ns", ns); 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newNs = 1; 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsing to get a precompiled schemas. 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF; 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu->schema = xmlRelaxNGParseDocument(ctxt, root); 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((docu->schema != NULL) && 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (docu->schema->topgrammar != NULL)) { 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu->content = docu->schema->topgrammar->start; 4787df143a5041f03a22808b59c76698770b74692815Selim Gurun if (docu->schema->topgrammar->refs) 4788df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGParseImportRefs(ctxt, docu->schema->topgrammar); 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the externalRef may be reused in a different ns context 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newNs == 1) { 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnsetProp(root, BAD_CAST "ns"); 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = docu->content; 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePattern: 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the pattern node. 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG pattern node. 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error or if no 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pattern is generated. 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL; 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(node, "element")) { 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseElement(ctxt, node); 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "attribute")) { 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseAttribute(ctxt, node); 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "empty")) { 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_EMPTY; 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_NOT_EMPTY, 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "empty: had a child node\n", NULL, NULL); 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "text")) { 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_TEXT; 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TEXT_HAS_CHILD, 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "text: had a child node\n", NULL, NULL); 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "zeroOrMore")) { 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_ZEROORMORE; 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 1); 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "oneOrMore")) { 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_ONEORMORE; 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 1); 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "optional")) { 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_OPTIONAL; 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 1); 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "choice")) { 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_CHOICE; 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "group")) { 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_GROUP; 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "ref")) { 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_REF; 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = xmlGetProp(node, BAD_CAST "name"); 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->name == NULL) { 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n", 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(def->name); 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(def->name, 0)) { 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_NAME_INVALID, 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ref name '%s' is not an NCName\n", def->name, 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n", 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->refs == NULL) 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->refs = xmlHashCreate(10); 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->refs == NULL) { 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not create references hash\n", NULL, NULL); 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def); 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) { 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev; 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = (xmlRelaxNGDefinePtr) 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(ctxt->grammar->refs, def->name); 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL) { 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->name != NULL) { 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error refs definitions '%s'\n", 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, NULL); 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error refs definitions\n", 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->nextHash = prev->nextHash; 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->nextHash = def; 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "data")) { 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseData(ctxt, node); 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "value")) { 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseValue(ctxt, node); 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "list")) { 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_LIST; 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "interleave")) { 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseInterleave(ctxt, node); 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "externalRef")) { 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGProcessExternalRef(ctxt, node); 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "notAllowed")) { 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_NOT_ALLOWED; 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY, 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: notAllowed element is not empty\n", 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "grammar")) { 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar, old; 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr oldparent; 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found <grammar> pattern\n"); 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldparent = ctxt->parentgrammar; 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old = ctxt->grammar; 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->parentgrammar = old; 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = xmlRelaxNGParseGrammar(ctxt, node->children); 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (old != NULL) { 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = old; 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->parentgrammar = oldparent; 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar != NULL) { 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar->next = old->next; 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old->next = grammar; 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar != NULL) 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = grammar->start; 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "parentRef")) { 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->parentgrammar == NULL) { 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT, 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Use of parentRef without a parent grammar\n", NULL, 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_PARENTREF; 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = xmlGetProp(node, BAD_CAST "name"); 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->name == NULL) { 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_NAME, 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "parentRef has no name\n", NULL, NULL); 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(def->name); 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(def->name, 0)) { 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID, 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "parentRef name '%s' is not an NCName\n", 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, NULL); 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY, 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "parentRef is not empty\n", NULL, NULL); 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->parentgrammar->refs == NULL) 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->parentgrammar->refs = xmlHashCreate(10); 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->parentgrammar->refs == NULL) { 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not create references hash\n", NULL, NULL); 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def->name != NULL) { 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def); 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) { 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev; 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = (xmlRelaxNGDefinePtr) 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(ctxt->parentgrammar->refs, def->name); 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL) { 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error parentRef definitions '%s'\n", 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, NULL); 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->nextHash = prev->nextHash; 5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->nextHash = def; 5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "mixed")) { 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n", 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseInterleave(ctxt, node); 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def != NULL) { 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr tmp; 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->content != NULL) && (def->content->next != NULL)) { 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGNewDefine(ctxt, node); 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->type = XML_RELAXNG_GROUP; 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->content = def->content; 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = tmp; 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGNewDefine(ctxt, node); 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->type = XML_RELAXNG_TEXT; 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = def->content; 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = tmp; 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_CONSTRUCT, 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected node %s is not a pattern\n", node->name, 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseAttribute: 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG attribute node. 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, cur; 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old_flags; 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ATTRIBUTE; 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->def; 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_EMPTY, 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseattribute: attribute has no children\n", 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old_flags = ctxt->flags; 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE; 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseNameClass(ctxt, child, ret); 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child != NULL) { 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, child); 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = cur; 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = ret; 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CONTENT, 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "attribute has invalid content\n", NULL, 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_NOOP, 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, noop found in attribute\n", 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child != NULL) { 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN, 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "attribute has multiple children\n", NULL, NULL); 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = old_flags; 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseExceptNameClass: 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the except node 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: 1 if within an attribute, 0 if within an element 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node. 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt, 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, int attr) 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, cur, last = NULL; 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_RELAXNG(node, "except")) { 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MISSING, 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting an except node\n", NULL, NULL); 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->next != NULL) { 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MULTIPLE, 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "exceptNameClass allows only a single except node\n", 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n", 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_EXCEPT; 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGNewDefine(ctxt, child); 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr) 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_ATTRIBUTE; 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_ELEMENT; 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) { 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = cur; 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseNameClass: 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the nameClass node 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the current definition 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node. 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, tmp; 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *val; 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = def; 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) || 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_RELAXNG(node, "nsName"))) { 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type != XML_RELAXNG_ELEMENT) && 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type != XML_RELAXNG_ATTRIBUTE)) { 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = def; 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ATTRIBUTE; 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ELEMENT; 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(node, "name")) { 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlNodeGetContent(node); 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(val); 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(val, 0)) { 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->parent != NULL) 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s name '%s' is not an NCName\n", 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name, val); 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "name '%s' is not an NCName\n", 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val, NULL); 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = val; 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlGetProp(node, BAD_CAST "ns"); 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns = val; 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val != NULL) && 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) { 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute with namespace '%s' is not allowed\n", 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val, NULL); 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val != NULL) && 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) { 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_XMLNS_NAME, 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute with QName 'xmlns' is not allowed\n", 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val, NULL); 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "anyName")) { 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = NULL; 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns = NULL; 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nameClass = 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseExceptNameClass(ctxt, node->children, 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type == 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ATTRIBUTE)); 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "nsName")) { 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = NULL; 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns = xmlGetProp(node, BAD_CAST "ns"); 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->ns == NULL) { 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_NSNAME_NO_NS, 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "nsName has no ns attribute\n", NULL, NULL); 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->ns != NULL) && 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) { 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute with namespace '%s' is not allowed\n", 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns, NULL); 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nameClass = 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseExceptNameClass(ctxt, node->children, 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type == 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ATTRIBUTE)); 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "choice")) { 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr last = NULL; 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = def; 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_CHOICE; 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY, 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element choice is empty\n", NULL, NULL); 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseNameClass(ctxt, child, ret); 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = ret->nameClass = tmp; 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp; 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp; 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_CONTENT, 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "expecting name, anyName, nsName or choice : got %s\n", 5373df143a5041f03a22808b59c76698770b74692815Selim Gurun (node == NULL ? (const xmlChar *) "nothing" : node->name), 5374df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL); 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != def) { 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->nameClass == NULL) { 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->nameClass = ret; 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = def->nameClass; 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp->next != NULL) { 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = ret; 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseElement: 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG element node. 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, cur, last; 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *olddefine; 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ELEMENT; 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->def; 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_EMPTY, 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseElement: element has no children\n", 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseNameClass(ctxt, child, ret); 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT, 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseElement: element has no content\n", 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project olddefine = ctxt->define; 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = NULL; 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, child); 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = ret; 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = last = cur; 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((last->type == XML_RELAXNG_ELEMENT) && 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->content == last)) { 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = xmlRelaxNGNewDefine(ctxt, node); 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->content != NULL) { 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content->type = XML_RELAXNG_GROUP; 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content->content = last; 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = last; 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = ret->attrs; 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = cur; 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, start found in element\n", 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, param found in element\n", 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, except found in element\n", 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, noop found in element\n", 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = olddefine; 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePatterns: 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: list of nodes 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @group: use an implicit <group> for elements 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node. 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes, 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int group) 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent; 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = ctxt->def; 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (nodes != NULL) { 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(nodes, "element")) { 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseElement(ctxt, nodes); 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = last = cur; 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) && 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def == last)) { 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, nodes); 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_GROUP; 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = last; 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, nodes); 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = last = cur; 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes = nodes->next; 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseStart: 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: start children nodes 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node. 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL, last; 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes == NULL) { 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n", 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(nodes, "empty")) { 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, nodes); 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_EMPTY; 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes->children != NULL) { 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_EMPTY_CONTENT, 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element empty is not empty\n", NULL, NULL); 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(nodes, "notAllowed")) { 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, nodes); 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_NOT_ALLOWED; 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes->children != NULL) { 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY, 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element notAllowed is not empty\n", NULL, NULL); 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParsePatterns(ctxt, nodes, 1); 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->start != NULL) { 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = ctxt->grammar->start; 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (last->next != NULL) 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = last->next; 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = def; 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->start = def; 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes = nodes->next; 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes != NULL) { 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_START_CONTENT, 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "start more than one children\n", NULL, NULL); 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammarContent: 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG grammar node. 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr nodes) 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, tmp; 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes == NULL) { 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_EMPTY, 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "grammar has no children\n", NULL, NULL); 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (nodes != NULL) { 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(nodes, "start")) { 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes->children == NULL) { 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "start has no children\n", NULL, NULL); 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseStart(ctxt, nodes->children); 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(nodes, "define")) { 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseDefine(ctxt, nodes); 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(nodes, "include")) { 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseInclude(ctxt, nodes); 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "grammar has unexpected child %s\n", nodes->name, 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes = nodes->next; 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckReference: 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ref: the ref 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name associated to the defines 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name. 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckReference(xmlRelaxNGDefinePtr ref, 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ctxt, 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * name) 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def, cur; 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5676df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 5677df143a5041f03a22808b59c76698770b74692815Selim Gurun * Those rules don't apply to imported ref from xmlRelaxNGParseImportRef 5678df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 5679df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ref->dflags & IS_EXTERNAL_REF) 5680df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 5681df143a5041f03a22808b59c76698770b74692815Selim Gurun 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = ctxt->grammar; 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) { 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error: no grammar in CheckReference %s\n", 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref->content != NULL) { 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error: reference has content in CheckReference %s\n", 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->defs != NULL) { 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlHashLookup(grammar->defs, name); 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def != NULL) { 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ref; 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = def; 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->nextHash; 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Reference %s has no matching definition\n", name, 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Reference %s has no matching definition\n", name, 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCombine: 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the define(s) list 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name associated to the defines 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name. 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCombine(xmlRelaxNGDefinePtr define, 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name) 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *combine; 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int choiceOrInterleave = -1; 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int missing = 0; 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, last, tmp, tmp2; 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->nextHash == NULL) 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = define; 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine = xmlGetProp(cur->node, BAD_CAST "combine"); 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (combine != NULL) { 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(combine, BAD_CAST "choice")) { 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 1; 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 0) { 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Defines for %s use both 'choice' and 'interleave'\n", 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 1) { 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Defines for %s use both 'choice' and 'interleave'\n", 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE, 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Defines for %s use unknown combine value '%s''\n", 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, combine); 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(combine); 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (missing == 0) 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project missing = 1; 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE, 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Some defines for %s needs the combine attribute\n", 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->nextHash; 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGCheckCombine(): merging %s defines: %d\n", 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, choiceOrInterleave); 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGNewDefine(ctxt, define->node); 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_INTERLEAVE; 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_CHOICE; 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = define; 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->content != NULL) { 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->content->next != NULL) { 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we need first to create a wrapper. 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node); 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2->type = XML_RELAXNG_GROUP; 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2->content = tmp->content; 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = tmp->content; 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = tmp2; 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp2; 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp2; 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->content = cur; 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->nextHash; 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->content = cur; 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) { 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->interleaves = xmlHashCreate(10); 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) { 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to create interleaves hash table\n", NULL, 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char tmpname[32]; 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0) { 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to add %s to hash table\n", 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) tmpname, NULL); 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCombineStart: 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar: the grammar 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine rule for all the start 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar. 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt, 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar) 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr starts; 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *combine; 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int choiceOrInterleave = -1; 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int missing = 0; 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project starts = grammar->start; 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((starts == NULL) || (starts->next == NULL)) 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = starts; 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->node == NULL) || (cur->node->parent == NULL) || 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) { 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine = NULL; 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING, 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error: start element not found\n", NULL, 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine = xmlGetProp(cur->node->parent, BAD_CAST "combine"); 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (combine != NULL) { 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(combine, BAD_CAST "choice")) { 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 1; 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 0) { 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "<start> use both 'choice' and 'interleave'\n", 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 1) { 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "<start> use both 'choice' and 'interleave'\n", 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE, 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "<start> uses unknown combine value '%s''\n", 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine, NULL); 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(combine); 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (missing == 0) 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project missing = 1; 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_NEED_COMBINE, 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Some <start> element miss the combine attribute\n", 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGCombineStart(): merging <start>: %d\n", 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave); 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGNewDefine(ctxt, starts->node); 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_INTERLEAVE; 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_CHOICE; 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = grammar->start; 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar->start = cur; 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) { 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->interleaves = xmlHashCreate(10); 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) { 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to create interleaves hash table\n", NULL, 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char tmpname[32]; 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0) { 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to add %s to hash table\n", 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) tmpname, NULL); 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCycles: 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the counter 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for cycles. 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if check passed, and -1 in case of error 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt, 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, int depth) 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ret == 0) && (cur != NULL)) { 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_REF) || 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF)) { 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->depth == -1) { 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = depth; 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = -2; 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (depth == cur->depth) { 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_CYCLE, 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Detected a cycle in %s references\n", 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_ELEMENT) { 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1); 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryUnlink: 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the definition to unlink 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: the parent definition 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prev: the previous sibling definition 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to unlink a definition. If not possble make it a NOOP 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new prev definition 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev) 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != NULL) { 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = cur->next; 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (parent != NULL) { 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (parent->content == cur) 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->content = cur->next; 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (parent->attrs == cur) 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->attrs = cur->next; 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (parent->nameClass == cur) 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->nameClass = cur->next; 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_NOOP; 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (prev); 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSimplify: 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for simplification of empty and notAllowed 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt, 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent) 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev = NULL; 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_REF) || 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF)) { 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->depth != -3) { 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = -3; 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->content, cur); 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ATTRIBUTE) || 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_LIST) || 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_GROUP) || 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE) || 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ONEORMORE) || 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_NOT_ALLOWED; 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) { 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EMPTY) { 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ONEORMORE) || 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_EMPTY; 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_GROUP) || 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE))) { 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->content, cur); 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL)) 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->attrs, cur); 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nameClass != NULL) 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->nameClass, cur); 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * On Elements, try to move attribute only generating rules on 6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the attrs rules. 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_RELAXNG_ELEMENT) { 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int attronly; 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr tmp, pre; 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->content != NULL) { 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attronly = 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGenerateAttributes(ctxt, cur->content); 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attronly == 1) { 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * migrate cur->content to attrs 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->content; 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = tmp->next; 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = cur->attrs; 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->attrs = tmp; 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * cur->content can generate elements or text 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pre = cur->content; 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((pre != NULL) && (pre->next != NULL)) { 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = pre->next; 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp); 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attronly == 1) { 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * migrate tmp to attrs 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pre->next = tmp->next; 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = cur->attrs; 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->attrs = tmp; 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pre = tmp; 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This may result in a simplification 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_GROUP) || 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_INTERLEAVE)) { 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content == NULL) 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_EMPTY; 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (cur->content->next == NULL) { 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent == NULL) && (prev == NULL)) { 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_NOOP; 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (prev == NULL) { 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->content = cur->content; 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content->next = cur->next; 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content->next = cur->next; 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = cur->content; 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the current node may have been transformed back 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_EXCEPT) && 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->content != NULL) && 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) { 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ATTRIBUTE) || 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_LIST) || 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_GROUP) || 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE) || 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ONEORMORE) || 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_NOT_ALLOWED; 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_CHOICE)) { 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EMPTY) { 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ONEORMORE) || 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_EMPTY; 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_GROUP) || 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE) || 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_CHOICE))) { 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGroupContentType: 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1: the first content type 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2: the second content type 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to group 2 content types 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1, 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGContentType ct2) 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_ERROR)) 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_ERROR); 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ct1 == XML_RELAXNG_CONTENT_EMPTY) 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ct2); 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ct2 == XML_RELAXNG_CONTENT_EMPTY) 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ct1); 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) && 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_COMPLEX); 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_ERROR); 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGMaxContentType: 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1: the first content type 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2: the second content type 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the max content-type 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1, 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGContentType ct2) 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_ERROR)) 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_ERROR); 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) || 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_SIMPLE)) 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_SIMPLE); 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) || 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_COMPLEX); 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_EMPTY); 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckRules: 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current definition 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: some accumulated flags 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ptype: the parent type 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for rules in section 7.1 and 7.2 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type of @cur 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, int flags, 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGType ptype) 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6246df143a5041f03a22808b59c76698770b74692815Selim Gurun int nflags; 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY; 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_EMPTY; 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_REF) || 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF)) { 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This should actually be caught by list//element(ref) at the 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element boundaries, c.f. Bug #159968 local refs are dropped 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in step 4.19. 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_REF, 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//ref\n", NULL, 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF, 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//ref\n", 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6270df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->content == NULL) { 6271df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_RELAXNG_PARENTREF) 6272df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF, 6273df143a5041f03a22808b59c76698770b74692815Selim Gurun "Internal found no define for parent refs\n", 6274df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL, NULL); 6275df143a5041f03a22808b59c76698770b74692815Selim Gurun else 6276df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF, 6277df143a5041f03a22808b59c76698770b74692815Selim Gurun "Internal found no define for ref %s\n", 6278df143a5041f03a22808b59c76698770b74692815Selim Gurun (cur->name ? cur->name: BAD_CAST "null"), NULL); 6279df143a5041f03a22808b59c76698770b74692815Selim Gurun } 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->depth > -4) { 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = -4; 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckRules(ctxt, cur->content, 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags, cur->type); 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = ret - 15; 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->depth == -4) { 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_COMPLEX; 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGContentType) (cur->depth + 15); 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_ELEMENT) { 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The 7.3 Attribute derivation rule for groups is plugged there 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckGroupAttrs(ctxt, cur); 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM, 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//element(ref)\n", 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM, 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//element(ref)\n", 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern attribute//element(ref)\n", 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern attribute//element(ref)\n", 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reset since in the simple form elements are only child 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of grammar/define 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = 0; 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type); 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != XML_RELAXNG_CONTENT_EMPTY) { 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY, 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s attributes have a content type error\n", 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == XML_RELAXNG_CONTENT_ERROR) { 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR, 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has a content type error\n", 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_COMPLEX; 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_ATTRIBUTE) { 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR, 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern attribute//attribute\n", 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR, 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//attribute\n", 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_OOMGROUP) { 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR, 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern oneOrMore//group//attribute\n", 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) { 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern oneOrMore//interleave//attribute\n", 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR, 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//attribute\n", 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR, 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//attribute\n", 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!(flags & XML_RELAXNG_IN_ONEORMORE)) 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (cur->name == NULL)) { 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns == NULL) { 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR, 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found anyName attribute without oneOrMore ancestor\n", 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR, 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found nsName attribute without oneOrMore ancestor\n", 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_ATTRIBUTE; 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type); 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_EMPTY; 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->type == XML_RELAXNG_ONEORMORE) || 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ZEROORMORE)) { 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//oneOrMore\n", 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE, 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//oneOrMore\n", 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_ONEORMORE; 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGGroupContentType(ret, ret); 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_LIST) { 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST, 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//list\n", NULL, 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST, 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//list\n", 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST, 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//list\n", NULL, 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_LIST; 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_GROUP) { 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP, 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//group\n", 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP, 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//group\n", NULL, 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ONEORMORE) 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_OOMGROUP; 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags; 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The 7.3 Attribute derivation rule for groups is plugged there 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckGroupAttrs(ctxt, cur); 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_INTERLEAVE) { 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE, 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//interleave\n", 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//interleave\n", 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//interleave\n", 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ONEORMORE) 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE; 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags; 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EXCEPT) { 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent != NULL) && 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->type == XML_RELAXNG_DATATYPE)) 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_DATAEXCEPT; 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags; 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_DATATYPE) { 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA, 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//data\n", NULL, 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_SIMPLE; 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_VALUE) { 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE, 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//value\n", NULL, 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_SIMPLE; 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_TEXT) { 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT, 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//text\n", NULL, 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT, 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//text\n", 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT, 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//text\n", NULL, 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_COMPLEX; 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EMPTY) { 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY, 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//empty\n", 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY, 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//empty\n", NULL, 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_EMPTY; 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_CHOICE) { 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckChoiceDeterminism(ctxt, cur); 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ptype == XML_RELAXNG_GROUP) { 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlRelaxNGGroupContentType(val, ret); 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_INTERLEAVE) { 6531df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 6532df143a5041f03a22808b59c76698770b74692815Selim Gurun * TODO: scan complain that tmp is never used, seems on purpose 6533df143a5041f03a22808b59c76698770b74692815Selim Gurun * need double-checking 6534df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGGroupContentType(val, ret); 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != XML_RELAXNG_CONTENT_ERROR) 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGMaxContentType(val, ret); 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_CHOICE) { 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlRelaxNGMaxContentType(val, ret); 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_LIST) { 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = XML_RELAXNG_CONTENT_SIMPLE; 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_EXCEPT) { 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == XML_RELAXNG_CONTENT_ERROR) 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = XML_RELAXNG_CONTENT_ERROR; 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = XML_RELAXNG_CONTENT_SIMPLE; 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlRelaxNGGroupContentType(val, ret); 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (val); 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammar: 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG <grammar> node 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal xmlRelaxNGGrammarPtr built or 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr ret, tmp, old; 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n"); 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewGrammar(ctxt); 6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link the new grammar in the tree 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->grammar; 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar != NULL) { 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->grammar->children; 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->children = ret; 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp->next != NULL) 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = ret; 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old = ctxt->grammar; 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = ret; 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseGrammarContent(ctxt, nodes); 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = ret; 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar == NULL) { 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to parse <grammar> content\n", NULL, NULL); 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->grammar->start == NULL) { 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START, 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element <grammar> has no <start>\n", NULL, NULL); 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Apply 4.17 mergingd rules to defines and starts 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCombineStart(ctxt, ret); 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->defs != NULL) { 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine, 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * link together defines and refs in this grammar 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->refs != NULL) { 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference, 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6622df143a5041f03a22808b59c76698770b74692815Selim Gurun 662360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* @@@@ */ 662460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = old; 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDocument: 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the root node of the RelaxNG schema 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG definition resource and build an internal 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNG struture which can be used to validate instances. 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built or 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema = NULL; 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *olddefine; 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr old; 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (node == NULL)) 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = xmlRelaxNGNewRelaxNG(ctxt); 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project olddefine = ctxt->define; 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = NULL; 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(node, "grammar")) { 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children); 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr tmp, ret; 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt); 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar == NULL) { 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (schema); 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link the new grammar in the tree 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->grammar; 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar != NULL) { 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->grammar->children; 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->children = ret; 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp->next != NULL) 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = ret; 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old = ctxt->grammar; 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = ret; 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseStart(ctxt, node); 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (old != NULL) 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = old; 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = olddefine; 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar->start != NULL) { 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0); 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) { 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL); 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((schema->topgrammar->start != NULL) && 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (schema->topgrammar->start->type == XML_RELAXNG_NOOP) && 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (schema->topgrammar->start->next != NULL)) 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar->start = 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar->start->content; 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start, 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_IN_START, XML_RELAXNG_NOOP); 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseDocument() failed\n"); 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (schema); 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 670994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 671094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Reading RelaxNGs * 671194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewParserCtxt: 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the location of the schema 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that file/resource expected 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file. 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewParserCtxt(const char *URL) 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ret; 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(NULL, "building parser\n"); 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->URL = xmlStrdup((const xmlChar *) URL); 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = xmlGenericError; 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewMemParserCtxt: 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: a pointer to a char array containing the schemas 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the array 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that memory buffer expected 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file. 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewMemParserCtxt(const char *buffer, int size) 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ret; 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buffer == NULL) || (size <= 0)) 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(NULL, "building parser\n"); 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->buffer = buffer; 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->size = size; 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = xmlGenericError; 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDocParserCtxt: 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a preparsed document tree 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parser context for that document. 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: since the process of compiling a RelaxNG schemas modifies the 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document, the @doc parameter is duplicated internally. 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDocParserCtxt(xmlDocPtr doc) 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ret; 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr copy; 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy = xmlCopyDoc(doc, 1); 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (copy == NULL) 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(NULL, "building parser\n"); 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->document = copy; 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->freedoc = 1; 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeParserCtxt: 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt) 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->URL != NULL) 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->URL); 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->doc != NULL) 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocument(ctxt->doc); 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves != NULL) 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->interleaves, NULL); 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->documents != NULL) 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocumentList(ctxt->documents); 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->includes != NULL) 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeIncludeList(ctxt->includes); 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab != NULL) 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->docTab); 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab != NULL) 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->incTab); 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->defTab != NULL) { 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->defNr; i++) 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDefine(ctxt->defTab[i]); 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->defTab); 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->document != NULL) && (ctxt->freedoc)) 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormExtSpace: 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes the leading and ending spaces of the value 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string is modified "in situ" 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormExtSpace(xmlChar * value) 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *start = value; 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur = value; 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == start) { 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = cur; 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) { 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start = 0; 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start++ = *cur++; 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) { 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start = 0; 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't try to normalize the inner spaces */ 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) { 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start = 0; 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start++ = *cur++; 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupAttributes: 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a Relax-NG node 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the attributes on the given node 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr cur, next; 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node->properties; 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = cur->next; 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns == NULL) || 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "name")) { 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "element")) && 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "attribute")) && 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "ref")) && 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "parentRef")) && 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "param")) && 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "define"))) { 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "type")) { 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "value")) && 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "data"))) { 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "href")) { 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) && 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "include"))) { 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) { 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "start")) && 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "define"))) { 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) { 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *val; 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlNodeListGetString(node->doc, cur->children, 1); 6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) { 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val[0] != 0) { 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURI((const char *) val); 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri == NULL) { 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INVALID_URI, 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s contains invalid URI %s\n", 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, val); 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->scheme == NULL) { 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_URI_NOT_ABSOLUTE, 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s URI %s is not absolute\n", 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, val); 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->fragment != NULL) { 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_URI_FRAGMENT, 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s URI %s has a fragment ID\n", 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, val); 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(val); 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) { 6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_ATTRIBUTE, 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unknown attribute %s on %s\n", cur->name, 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name); 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next; 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTree: 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @root: an xmlNodePtr subtree 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the subtree from unwanted nodes for parsing, resolve 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups. 6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, delete; 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = NULL; 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = root; 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (delete != NULL) { 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(delete); 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(delete); 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = NULL; 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.1. Annotations 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns == NULL) || 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent != NULL) && 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->type == XML_ELEMENT_NODE) && 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) || 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->parent->name, BAD_CAST "value")) || 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) { 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_FOREIGN_ELEMENT, 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element %s doesn't allow foreign elements\n", 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent->name, NULL); 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupAttributes(ctxt, cur); 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) { 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href, *ns, *base, *URL; 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr docu; 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->parent; 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmp->type == XML_ELEMENT_NODE)) { 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(tmp, BAD_CAST "ns"); 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetProp(cur, BAD_CAST "href"); 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href == NULL) { 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: externalRef has no href attribute\n", 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURI((const char *) href); 7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri == NULL) { 7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Incorrect URI for externalRef %s\n", 7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->fragment != NULL) { 7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Fragment forbidden in URI for externalRef %s\n", 7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = xmlNodeGetBase(cur->doc, cur); 7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL = xmlBuildURI(href, base); 7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) { 7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compute URL for externalRef %s\n", 7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu = xmlRelaxNGLoadExternalRef(ctxt, URL, ns); 7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu == NULL) { 7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE, 7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to load externalRef %s\n", URL, 7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->psvi = docu; 7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "include")) { 7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href, *ns, *base, *URL; 7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr incl; 7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetProp(cur, BAD_CAST "href"); 7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href == NULL) { 7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, 7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: include has no href attribute\n", 7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = xmlNodeGetBase(cur->doc, cur); 7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL = xmlBuildURI(href, base); 7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) { 7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compute URL for include %s\n", 7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->parent; 7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && 7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmp->type == XML_ELEMENT_NODE)) { 7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(tmp, BAD_CAST "ns"); 7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns); 7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl == NULL) { 7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_INCLUDE_FAILURE, 7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to load include %s\n", URL, 7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->psvi = incl; 7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) || 7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->name, BAD_CAST "attribute"))) 7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name, *ns; 7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr text = NULL; 7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.8. name attribute of element 7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and attribute elements 7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlGetProp(cur, BAD_CAST "name"); 7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children == NULL) { 7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project text = 7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNewChild(cur, cur->ns, BAD_CAST "name", 7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name); 7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlNewDocNode(cur->doc, cur->ns, 7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "name", NULL); 7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node != NULL) { 7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAddPrevSibling(cur->children, node); 7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project text = xmlNewText(name); 7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAddChild(node, text); 7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project text = node; 7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (text == NULL) { 7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_CREATE_FAILURE, 7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to create a name %s element\n", 7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnsetProp(cur, BAD_CAST "name"); 7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (text != NULL) { 7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(text, BAD_CAST "ns", ns); 7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlUnsetProp(cur, BAD_CAST "ns"); */ 7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, 7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "attribute")) { 7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(text, BAD_CAST "ns", BAD_CAST ""); 7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) || 7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->name, BAD_CAST "nsName")) || 7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->name, BAD_CAST "value"))) { 7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.8. name attribute of element 7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and attribute elements 7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHasProp(cur, BAD_CAST "ns") == NULL) { 7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns = NULL; 7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = cur->parent; 7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && 7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_ELEMENT_NODE)) { 7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(node, BAD_CAST "ns"); 7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(cur, BAD_CAST "ns", BAD_CAST ""); 7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(cur, BAD_CAST "ns", ns); 7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "name")) { 7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name, *local, *prefix; 7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification: 4.10. QNames 7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlNodeGetContent(cur); 7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project local = xmlSplitQName2(name, &prefix); 7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (local != NULL) { 7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlSearchNs(cur->doc, cur, prefix); 7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PREFIX_UNDEFINED, 7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: no namespace for prefix %s\n", 7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix, NULL); 7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(cur, BAD_CAST "ns", 7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->href); 7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetContent(cur, local); 7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(local); 7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(prefix); 7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4.16 7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "nsName")) { 7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, 7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found nsName/except//nsName forbidden construct\n", 7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) && 7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur != root)) { 7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldflags = ctxt->flags; 7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4.16 7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent != NULL) && 7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name, BAD_CAST "anyName"))) { 7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT; 7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupTree(ctxt, cur); 7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->parent != NULL) && 7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name, BAD_CAST "nsName"))) { 7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT; 7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupTree(ctxt, cur); 7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) { 7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4.16 7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) { 7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, 7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found anyName/except//anyName forbidden construct\n", 7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, 7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found nsName/except//anyName forbidden construct\n", 7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Thisd is not an else since "include" is transformed 7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into a div 7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "div")) { 7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns; 7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child, ins, tmp; 7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implements rule 4.11 7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = cur->children; 7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ins = cur; 7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlHasProp(child, BAD_CAST "ns")) { 7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(child, BAD_CAST "ns", ns); 7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = child->next; 7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(child); 7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ins = xmlAddNextSibling(ins, child); 7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = tmp; 7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since we are about to delete cur, if it's nsDef is non-NULL we 7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to preserve it (it contains the ns definitions for the 7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * children we just moved). We'll just stick it on to the end 7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of cur->parent's list, since it's never going to be re-serialized 7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (bug 143738). 7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nsDef != NULL) { 7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef; 7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (parDef->next != NULL) 7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parDef = parDef->next; 7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parDef->next = cur->nsDef; 7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsDef = NULL; 7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.2 whitespaces 7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((cur->type == XML_TEXT_NODE) || 7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE)) { 7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_NODE(cur)) { 7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->parent->type == XML_ELEMENT_NODE) { 7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value")) 7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && 7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual 7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name, BAD_CAST "param"))) 7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to next node 7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children->type != XML_ENTITY_DECL) && 7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->type != XML_ENTITY_REF_NODE) && 7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->type != XML_ENTITY_NODE)) { 7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip_children: 7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == root) { 7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = NULL; 7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (delete != NULL) { 7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(delete); 7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(delete); 7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = NULL; 7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupDoc: 7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: an xmldocPtr document pointer 7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the document from unwanted nodes for parsing, resolve 7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups. 7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the cleaned up document or NULL in case of error 7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr 7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc) 7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the root 7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL, NULL); 7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupTree(ctxt, root); 7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (doc); 7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParse: 7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal 7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances. 7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built from the resource or 7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPtr 7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt) 7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr ret = NULL; 7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInitTypes(); 7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First step is to parse the input document into an DOM/Infoset 7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->URL != NULL) { 7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) ctxt->URL,NULL,0); 7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: could not load %s\n", ctxt->URL, 7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->buffer != NULL) { 7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0); 7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: could not parse schemas\n", NULL, 7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->document != NULL) { 7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = ctxt->document; 7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_EMPTY, 7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: nothing to parse\n", NULL, NULL); 7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = doc; 7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some preprocessing of the document content 7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlRelaxNGCleanupDoc(ctxt, doc); 7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then do the parsing for good 7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, (xmlNodePtr) doc, 7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL); 752594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGParseDocument(ctxt, root); 7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the ref/defines links 7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * try to preprocess interleaves 7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves != NULL) { 7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(ctxt->interleaves, 7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt); 7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if there was a parsing error return NULL 7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors > 0) { 7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFree(ret); 7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * try to compile (parts of) the schemas 7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) { 7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->topgrammar->start->type != XML_RELAXNG_START) { 7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; 7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, NULL); 7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def != NULL) { 7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_START; 7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = ret->topgrammar->start; 7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->topgrammar->start = def; 7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start); 7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Transfer the pointer for cleanup at the schema level. 7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->documents = ctxt->documents; 7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->documents = NULL; 7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->includes = ctxt->includes; 7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes = NULL; 7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->defNr = ctxt->defNr; 7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->defTab = ctxt->defTab; 7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab = NULL; 7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->idref == 1) 7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->idref = 1; 7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserErrors: 7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error callback 7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning callback 7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks 7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a validation context 7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, 7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc err, 7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warn, void *ctx) 7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = err; 7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = warn; 7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = NULL; 7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetParserErrors: 7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error callback result 7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning callback result 7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks result 7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the callback information used to handle errors for a validation context 7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise. 7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, 7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc * err, 7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc * warn, void **ctx) 7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err != NULL) 7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *err = ctxt->error; 7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (warn != NULL) 7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *warn = ctxt->warning; 7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx != NULL) 7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctx = ctxt->userData; 7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserStructuredErrors: 7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror: the error callback 7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks 7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a parsing context 7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt, 7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror, 7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *ctx) 7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = serror; 7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = NULL; 7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = NULL; 7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 766794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 766894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Dump back a compiled form * 766994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGDumpDefine(FILE * output, 7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define); 7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefines: 7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines: a list of define structures 7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines) 7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefine(output, defines); 7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefine: 7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: a define structure 7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define) 7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) 7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<empty/>\n"); 7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<notAllowed/>\n"); 7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<text/>\n"); 7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<element>\n"); 7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<name"); 7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) 7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " ns=\"%s\"", define->ns); 7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">%s</name>\n", define->name); 7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->attrs); 7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</element>\n"); 7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<list>\n"); 7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</list>\n"); 7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<oneOrMore>\n"); 7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</oneOrMore>\n"); 7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<zeroOrMore>\n"); 7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</zeroOrMore>\n"); 7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<choice>\n"); 7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</choice>\n"); 7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<group>\n"); 7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</group>\n"); 7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<interleave>\n"); 7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</interleave>\n"); 7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<optional>\n"); 7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</optional>\n"); 7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<attribute>\n"); 7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</attribute>\n"); 7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<define"); 7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " name=\"%s\"", define->name); 7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</define>\n"); 7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<ref"); 7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " name=\"%s\"", define->name); 7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</ref>\n"); 7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<parentRef"); 7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " name=\"%s\"", define->name); 7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</parentRef>\n"); 7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<externalRef>"); 7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</externalRef>\n"); 7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO break; 7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO break; 7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpGrammar: 7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar: a grammar structure 781094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @top: is this a top grammar 7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top) 7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) 7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<grammar"); 7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (top) 7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\""); 7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (grammar->combine) { 7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_COMBINE_UNDEFINED: 7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_COMBINE_CHOICE: 7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " combine=\"choice\""); 7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_COMBINE_INTERLEAVE: 7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " combine=\"interleave\""); 7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " <!-- invalid combine value -->"); 7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->start == NULL) { 7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " <!-- grammar had no start -->"); 7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<start>\n"); 7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefine(output, grammar->start); 7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</start>\n"); 7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO ? Dump the defines ? */ 7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</grammar>\n"); 7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDump: 7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema) 7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) 7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG empty or failed to compile\n"); 7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG: "); 7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc == NULL) { 7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "no document\n"); 7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (schema->doc->URL != NULL) { 7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%s\n", schema->doc->URL); 7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar == NULL) { 7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG has no top grammar\n"); 7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1); 7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpTree: 7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the transformed RelaxNG tree. 7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) 7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) 7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG empty or failed to compile\n"); 7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc == NULL) { 7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "no document\n"); 7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocDump(output, schema->doc); 7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 790394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 790494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Validation of compiled content * 790594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define); 7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledCallback: 7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: the regular expression instance 7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the token which matched 7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata: callback data, the define for the subelement if available 7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata: callback data, the Relax NG validation context 7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children. 7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, 7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * token, 7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *transdata, void *inputdata) 7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; 7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; 7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Compiled callback for: '%s'\n", token); 7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing context\n", token); 7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) { 7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token[0] == '#') 7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing define\n", token); 7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (define == NULL)) { 7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing info\n", token); 7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (define->type != XML_RELAXNG_ELEMENT) { 7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s define is not element\n", token); 7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_RELAXNG_OK) 7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, define); 7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->perr = ret; 7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledContent: 7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the RelaxNG validation context 7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the regular expression as compiled 7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: list of children to test against the regexp 7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the content model of an element or start using the regexp 7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error. 7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, 7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr regexp, xmlNodePtr content) 7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldperr; 7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (regexp == NULL)) 7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldperr = ctxt->perr; 7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(regexp, 7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateCompiledCallback, ctxt); 7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->perr = 0; 7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = content; 7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = cur; 7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlIsBlankNode(cur)) 7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt); 7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, 7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent->name); 7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns != NULL) { 8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString2(exec, cur->name, 8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->href, ctxt); 8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, cur->name, ctxt); 8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name); 8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to next element 8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, NULL, NULL); 8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: get some of the names needed to exit the current state of exec 8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); 8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There might be content model errors outside of the pure 8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * regexp validation, e.g. for attribute values. 8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->perr != 0)) { 8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->perr; 8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->perr = oldperr; 8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 804894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 804994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Progressive validation of when possible * 805094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines); 8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, 8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dolog); 8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); 8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPush: 8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: the regexp runtime for the new content model 8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new regexp for the current node content model on the stack 8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec) 8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab == NULL) { 8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemMax = 10; 8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax * 8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRegExecCtxtPtr)); 8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab == NULL) { 8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemNr >= ctxt->elemMax) { 8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemMax *= 2; 8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab, 8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemMax * 8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRegExecCtxtPtr)); 8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab == NULL) { 8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab[ctxt->elemNr++] = exec; 8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elem = exec; 8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPop: 8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the regexp of the current node content model from the stack 8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the exec or NULL if empty 8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegExecCtxtPtr 8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt) 8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr ret; 8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemNr <= 0) 8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemNr--; 8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->elemTab[ctxt->elemNr]; 8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab[ctxt->elemNr] = NULL; 8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemNr > 0) 8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1]; 8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elem = NULL; 8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateProgressiveCallback: 8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: the regular expression instance 8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the token which matched 8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata: callback data, the define for the subelement if available 8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata: callback data, the Relax NG validation context 8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children. 8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some of the in/out informations are passed via the context in @inputdata. 8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec 8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ATTRIBUTE_UNUSED, 8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * token, 8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *transdata, void *inputdata) 8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; 8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; 8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state, oldstate; 8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, oldflags; 8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Progressive callback for: '%s'\n", token); 8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing context\n", token); 8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ctxt->pnode; 8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = 1; 8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) { 8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token[0] == '#') 8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing define\n", token); 8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (define == NULL)) { 8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing info\n", token); 8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (define->type != XML_RELAXNG_ELEMENT) { 8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s define is not element\n", token); 8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_RELAXNG_OK) 8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) { 8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOTELEM); 8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel == NULL) { 8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this node cannot be validated in a streamable fashion 8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element '%s' validation is not streamable\n", 8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project token); 8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = 0; 8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pdef = define; 8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(define->contModel, 8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateProgressiveCallback, ctxt); 8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) { 8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGElemPush(ctxt, exec); 8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the attributes part of the content. 8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, node); 8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->attrs != NULL) { 8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); 8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); 8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp = -1, i; 8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validation error, log the message for the "best" one 8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGLogBestError(ctxt); 8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); 8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (tmp == -1)) 8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->pstate == -1) { 8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushElement: 8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new element start on the RelaxNG validation stack. 8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 if validating the 8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element requires a full node, and -1 in case of error. 8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, 8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc ATTRIBUTE_UNUSED, 8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) 8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (elem == NULL)) 8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name); 8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elem == 0) { 8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; 8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; 8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define; 8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = ctxt->schema; 8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = schema->topgrammar; 8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((grammar == NULL) || (grammar->start == NULL)) { 8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define = grammar->start; 8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel == NULL) { 8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pdef = define; 8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(define->contModel, 8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateProgressiveCallback, 8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) { 8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGElemPush(ctxt, exec); 8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pnode = elem; 8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = 0; 8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->ns != NULL) { 8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href, 8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt); 8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name); 8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->pstate == 0) 8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->pstate < 0) 8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", 8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name); 8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushCData: 8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the RelaxNG validation context 8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: some character data read 835094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the length of the data 8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the CData parsed for validation in the current stack 8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 otherwise 8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, 8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * data, int len ATTRIBUTE_UNUSED) 8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL)) 8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len); 8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*data != 0) { 8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_BLANK_CH(*data)) 8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data++; 8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*data == 0) 8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt); 8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO "); 8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "CDATA failed\n"); 8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePopElement: 8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the RelaxNG validation context 8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the element end from the RelaxNG validation stack. 8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise 8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt, 8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc ATTRIBUTE_UNUSED, 8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) 8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL)) 8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name); 8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * verify that we reached a terminal state of the content model. 8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRelaxNGElemPop(ctxt); 8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, NULL, NULL); 8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: get some of the names needed to exit the current state of exec 8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); 8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n", 8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name); 8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateFullElement: 8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a full subtree when xmlRelaxNGValidatePushElement() returned 8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 and the content of the node has been expanded. 8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 in case of error. 8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, 8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc ATTRIBUTE_UNUSED, 8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) 8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL)) 8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name); 8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, elem->parent); 8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->seq = elem; 8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_OK; 8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef); 8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK)) 8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 8473df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGFreeValidState(ctxt, ctxt->state); 8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", 8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name); 8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 848494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 848594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Generic interpreted validation implementation * 848694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define); 8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSkipIgnored: 8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the top node. 8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip ignorable nodes in that context 8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new sibling or NULL in case of error. 8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node) 8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO complete and handle entities 8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && 8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node->type == XML_COMMENT_NODE) || 8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_PI_NODE) || 8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_XINCLUDE_START) || 8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_XINCLUDE_END) || 8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((node->type == XML_TEXT_NODE) || 8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE)) && 8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->flags & FLAGS_MIXED_CONTENT) || 8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_BLANK_NODE(node)))))) { 8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->next; 8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (node); 8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormalize: 8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string to normalize 8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the normalizeWhiteSpace( s ) function from 8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * section 6.2.9 of the spec 8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL in case of error. 8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str) 8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret, *p; 8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) 8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = str; 8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*tmp != 0) 8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp++; 8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = tmp - str; 8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); 8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p = ret; 8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*str)) 8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str++; 8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*str != 0) { 8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(*str)) { 8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*str)) 8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str++; 8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*str == 0) 8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *p++ = ' '; 8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *p++ = *str++; 8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *p = 0; 8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDatatype: 8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the string value 8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the datatype definition 8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given value against the dataype 8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt, 8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value, 8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, xmlNodePtr node) 8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret, tmp; 8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *result = NULL; 8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define == NULL) || (define->data == NULL)) { 8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) define->data; 8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->check != NULL) { 8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->attrs != NULL) && 8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (define->attrs->type == XML_RELAXNG_PARAM)) { 8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->check(lib->data, define->name, value, &result, node); 8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = lib->check(lib->data, define->name, value, NULL, node); 8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name); 8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) 8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef(lib->data, result); 8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 2) { 8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value); 8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value); 8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = define->attrs; 8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) { 8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->facet != NULL) { 8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = lib->facet(lib->data, define->name, cur->name, 8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->value, value, result); 8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (define->content != NULL)) { 8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *oldvalue, *oldendvalue; 8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldendvalue = ctxt->state->endvalue; 8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = (xmlChar *) value; 8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = NULL; 8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, define->content); 8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = (xmlChar *) oldvalue; 8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = (xmlChar *) oldendvalue; 8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) 8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef(lib->data, result); 8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNextValue: 8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to the next value when validating within a list 8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the operation succeeded or an error code. 8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) 8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur; 8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->value; 8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (ctxt->state->endvalue == NULL)) { 8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = NULL; 8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = NULL; 8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) 8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((cur != ctxt->state->endvalue) && (*cur == 0)) 8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->state->endvalue) 8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = NULL; 8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = cur; 8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueList: 8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines: the list of definitions to verify 8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given set of definitions for the current value 8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, 8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, defines); 8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValue: 8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definition for the current value 8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, oldflags; 8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ctxt->state->value; 8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY:{ 8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value != NULL) && (value[0] != 0)) { 8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idx = 0; 8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(value[idx])) 8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project idx++; 8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value[idx] != 0) 8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE:{ 8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(value, define->value)) { 8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) define->data; 8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((lib != NULL) && (lib->comp != NULL)) { 8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = lib->comp(lib->data, define->name, 8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->value, define->node, 8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) define->attrs, 8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, ctxt->state->node); 8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, 8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->name); 8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *nval, *nvalue; 8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: trivial optimizations are possible by 8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computing at compile-time 8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nval = xmlRelaxNGNormalize(ctxt, define->value); 8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nvalue = xmlRelaxNGNormalize(ctxt, value); 8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nval == NULL) || (nvalue == NULL) || 8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(nval, nvalue))) 8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nval != NULL) 8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nval); 8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nvalue != NULL) 8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nvalue); 8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNextValue(ctxt); 8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE:{ 8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDatatype(ctxt, value, define, 8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNextValue(ctxt); 8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue; 8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, 0); 8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST:{ 8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue, *oldend, *val, *cur; 8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_values = 0; 8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldend = ctxt->state->endvalue; 8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStrdup(oldvalue); 8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStrdup(BAD_CAST ""); 8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = val; 8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(*cur)) { 8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = 0; 8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_values++; 8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur++ = 0; 8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "list value: '%s' found %d items\n", 8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue, nb_values); 8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_values = 0; 8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = cur; 8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = val; 8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == 0) && (cur != ctxt->state->endvalue)) 8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = cur; 8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->value == ctxt->state->endvalue) 8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = NULL; 8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to validate value: '%s' with %d rule\n", 8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value, nb_values); 8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_values++; 8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->state->value != NULL) && 8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->state->value != ctxt->state->endvalue)) { 8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, 8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value); 8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(val); 8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = oldend; 8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValueList(ctxt, define->content); 8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE:{ 8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur, *temp; 8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8888df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->state->value == NULL) || 8889df143a5041f03a22808b59c76698770b74692815Selim Gurun (*ctxt->state->value == 0)) { 8890df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 0; 8891df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8892df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->value; 8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = NULL; 8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((cur != NULL) && (cur != ctxt->state->endvalue) && 8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (temp != cur)) { 8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = cur; 8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateValueList(ctxt, define->content); 8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = temp; 8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->value; 8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, 0); 8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8914df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_RELAXNG_OPTIONAL:{ 8915df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar *temp; 8916df143a5041f03a22808b59c76698770b74692815Selim Gurun 8917df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->state->value == NULL) || 8918df143a5041f03a22808b59c76698770b74692815Selim Gurun (*ctxt->state->value == 0)) { 8919df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 0; 8920df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8921df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8922df143a5041f03a22808b59c76698770b74692815Selim Gurun oldflags = ctxt->flags; 8923df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->flags |= FLAGS_IGNORABLE; 8924df143a5041f03a22808b59c76698770b74692815Selim Gurun temp = ctxt->state->value; 8925df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlRelaxNGValidateValue(ctxt, define->content); 8926df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->flags = oldflags; 8927df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ret != 0) { 8928df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->state->value = temp; 8929df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->errNr > 0) 8930df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGPopErrors(ctxt, 0); 8931df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 0; 8932df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8933df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8934df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->errNr > 0) 8935df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGPopErrors(ctxt, 0); 8936df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8937df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT:{ 8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP:{ 8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 897160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (define->content == NULL) { 8972df143a5041f03a22808b59c76698770b74692815Selim Gurun VALID_ERR(XML_RELAXNG_ERR_NODEFINE); 8973df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = -1; 8974df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 8975df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlRelaxNGValidateValue(ctxt, define->content); 8976df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = -1; 8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueContent: 8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines: the list of definitions to verify 8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definitions for the current value 8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt, 8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, defines); 9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAttributeMatch: 9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to check 9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prop: the attribute 9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the attribute matches the definition nameClass 9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the attribute matches, 0 if no, or -1 in case of error 9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, 9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, xmlAttrPtr prop) 9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(define->name, prop->name)) 9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) { 9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns[0] == 0) { 9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prop->ns != NULL) 9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prop->ns == NULL) || 9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(define->ns, prop->ns->href))) 9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->nameClass == NULL) 9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define = define->nameClass; 9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->type == XML_RELAXNG_EXCEPT) { 9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); 9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO} 9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttribute: 9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given attribute definition for that node 9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt, 9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i; 9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value, *oldvalue; 9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr prop = NULL, tmp; 9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldseq; 9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->nbAttrLeft <= 0) 9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->state->nbAttrs; i++) { 9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->state->attrs[i]; 9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) { 9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((((define->ns == NULL) || (define->ns[0] == 0)) && 9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmp->ns == NULL)) || 9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((tmp->ns != NULL) && 9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(define->ns, tmp->ns->href)))) { 9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prop = tmp; 9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prop != NULL) { 9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = xmlNodeListGetString(prop->doc, prop->children, 1); 9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldseq = ctxt->state->seq; 9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = (xmlNodePtr) prop; 9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = value; 9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = NULL; 9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValueContent(ctxt, define->content); 9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->value != NULL) 9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ctxt->state->value; 9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value != NULL) 9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value); 9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = oldseq; 9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flag the attribute as processed 9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->attrs[i] = NULL; 9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->nbAttrLeft--; 9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateAttribute(%s): %d\n", 9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->name, ret); 9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->state->nbAttrs; i++) { 9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->state->attrs[i]; 9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && 9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) { 9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prop = tmp; 9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prop != NULL) { 9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = xmlNodeListGetString(prop->doc, prop->children, 1); 9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldseq = ctxt->state->seq; 9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = (xmlNodePtr) prop; 9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = value; 9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValueContent(ctxt, define->content); 9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->value != NULL) 9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ctxt->state->value; 9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value != NULL) 9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value); 9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = oldseq; 9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flag the attribute as processed 9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->attrs[i] = NULL; 9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->nbAttrLeft--; 9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) { 9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n", 9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->ns, ret); 9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateAttribute(anyName): %d\n", 9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret); 9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttributeList: 9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the list of definition to verify 9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node against the list of attribute definitions 9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, res; 9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int needmore = 0; 9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = defines; 9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_RELAXNG_ATTRIBUTE) { 9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0) 9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project needmore = 1; 9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!needmore) 9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = defines; 9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_RELAXNG_ATTRIBUTE) { 9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) || (ctxt->states != NULL)) { 9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlRelaxNGValidateDefinition(ctxt, cur); 9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res < 0) 9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == -1) /* continues on -2 */ 9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNodeMatchesList: 9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list: a NULL terminated array of definitions 9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a node can be matched by one of the definitions 9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches 0 otherwise 9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list) 9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0, tmp; 9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node == NULL) || (list == NULL)) 9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = list[i++]; 9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_ELEMENT_NODE) && 9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ELEMENT)) { 9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGElementMatch(NULL, cur, node); 9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((node->type == XML_TEXT_NODE) || 9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE)) && 9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_TEXT)) { 9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = list[i++]; 9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateInterleave: 9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate an interleave definition for a node. 9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, 9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i, nbgroups; 9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errNr = ctxt->errNr; 9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldflags; 9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr oldstate; 9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPartitionPtr partitions; 9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr group = NULL; 9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem; 9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *list = NULL, *lasts = NULL; 9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->data != NULL) { 9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions = (xmlRelaxNGPartitionPtr) define->data; 9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbgroups = partitions->nbgroups; 9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_INTERNODATA); 9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimizations for MIXED 9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->dflags & IS_MIXED) { 9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_MIXED_CONTENT; 9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbgroups == 2) { 9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a pure <mixed> case 9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, 9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT) 9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, 9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->groups[1]-> 9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule); 9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, 9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->groups[0]-> 9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule); 9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, 9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state-> 9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq); 9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build arrays to store the first and last node of the chain 9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pertaining to each group 9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); 9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(list, 0, nbgroups * sizeof(xmlNodePtr)); 9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); 9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts == NULL) { 9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(lasts, 0, nbgroups * sizeof(xmlNodePtr)); 9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Walk the sequence of children finding the right group and 9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * sorting them in sequences. 9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->seq; 9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur); 9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = cur; 9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = cur; 9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((partitions->triage != NULL) && 9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (partitions->flags & IS_DETERMINIST)) { 9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *tmp = NULL; 9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_TEXT_NODE) || 9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE)) { 9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text", 9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_ELEMENT_NODE) { 9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns != NULL) { 9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashLookup2(partitions->triage, cur->name, 9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->href); 9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashLookup2(partitions->triage, 9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", 9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->href); 9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(partitions->triage, cur->name, 9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(partitions->triage, BAD_CAST "#any", 9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = nbgroups; 9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = ((long) tmp) - 1; 9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->flags & IS_NEEDCHECK) { 9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[i]; 9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) 9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = nbgroups; 9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) { 9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[i]; 9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group == NULL) 9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGNodeMatchesList(cur, group->defs)) 9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We break as soon as an element not matched is found 9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= nbgroups) { 9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts[i] != NULL) { 9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i]->next = cur; 9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i] = cur; 9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = cur; 9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i] = cur; 9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) 9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastchg = cur->next; 9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastchg = cur; 9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur->next); 9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastelem = cur; 9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) { 9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); 9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[i]; 9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts[i] != NULL) { 9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = lasts[i]->next; 9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i]->next = NULL; 9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = list[i]; 9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); 9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->seq; 9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur); 9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); 9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j; 9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int best = -1; 9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lowattr = -1; 9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PBM: what happen if there is attributes checks in the interleaves 9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; j++) { 9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->states->tabState[j]->seq; 9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur); 9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (found == 0) { 9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { 9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* try to keep the latest one to mach old heuristic */ 9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lowattr == 0) 9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (found == 0) { 9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lowattr == -1) { 9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { 9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* try to keep the latest one to mach old heuristic */ 9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BIG PBM: here we pick only one restarting point :-( 9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states->nbState > 0) { 9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (best != -1) { 9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->states->tabState[best]; 9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[best] = NULL; 9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = 9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[ctxt->states->nbState - 1]; 9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[ctxt->states->nbState - 1] = NULL; 9483df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->nbState--; 9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState ; j++) { 9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]); 9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (found == 0) { 9492df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) { 9493df143a5041f03a22808b59c76698770b74692815Selim Gurun VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, 9494df143a5041f03a22808b59c76698770b74692815Selim Gurun (const xmlChar *) "noname"); 9495df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 9496df143a5041f03a22808b59c76698770b74692815Selim Gurun VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); 9497df143a5041f03a22808b59c76698770b74692815Selim Gurun } 9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts[i] != NULL) { 9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i]->next = last; 9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = lastelem; 9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project done: 9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * builds the next links chain from the prev one 9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = lastchg; 9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == start) || (cur->prev == NULL)) 9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prev->next = cur; 9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(lasts); 9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinitionList: 9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the list of definition to verify 9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node content against the (list) of definitions 9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt, 9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, res; 9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (defines == NULL) { 9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_INTERNAL, 9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "NULL definition list"); 9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) || (ctxt->states != NULL)) { 9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlRelaxNGValidateDefinition(ctxt, defines); 9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res < 0) 9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == -1) /* continues on -2 */ 9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElementMatch: 9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to check 9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element 9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the element matches the definition nameClass 9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the element matches, 0 if no, or -1 in case of error 9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, xmlNodePtr elem) 9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, oldflags = 0; 9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(elem->name, define->name)) { 9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name); 9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->ns != NULL) && (define->ns[0] != 0)) { 9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->ns == NULL) { 9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name); 9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrEqual(elem->ns->href, define->ns)) { 9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS, 9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, define->ns); 9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((elem->ns != NULL) && (define->ns != NULL) && 9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (define->name == NULL)) { 9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name); 9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((elem->ns != NULL) && (define->name != NULL)) { 9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name); 9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->nameClass == NULL) 9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define = define->nameClass; 9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->type == XML_RELAXNG_EXCEPT) { 9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGElementMatch(ctxt, list, elem); 9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (define->type == XML_RELAXNG_CHOICE) { 9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->nameClass; 9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGElementMatch(ctxt, list, elem); 9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, 0); 9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = -1; 9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGBestState: 9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report 9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about. I.e. a state with no element left in the child list 9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or the one with the less attributes left. 9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is called only if a falidation error was detected 9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the index of the "best" state or -1 in case of error 9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt) 9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, tmp; 9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int best = -1; 9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value = 1000000; 9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->states == NULL) || 9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->states->nbState <= 0)) 9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->seq != NULL) { 9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((best == -1) || (value > 100000)) { 9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = 100000; 9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = i; 9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = state->nbAttrLeft; 9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((best == -1) || (value > tmp)) { 9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = tmp; 9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = i; 9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (best); 9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLogBestError: 9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report 9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about and log it. 9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt) 9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int best; 9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->states == NULL) || 9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->states->nbState <= 0)) 9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = xmlRelaxNGBestState(ctxt); 9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((best >= 0) && (best < ctxt->states->nbState)) { 9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = ctxt->states->tabState[best]; 9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateElementEnd(ctxt, 1); 9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateElementEnd: 9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dolog: indicate that error logging should be done 9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the end of the element, implements check that 9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there is nothing left not consumed in the element content 9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or in the attribute list. 9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog) 9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->seq != NULL) { 9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq); 9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->seq != NULL) { 9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dolog) { 9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT, 9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, state->seq->name); 9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < state->nbAttrs; i++) { 9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->attrs[i] != NULL) { 9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dolog) { 9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR, 9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->attrs[i]->name, state->node->name); 9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1 - i); 9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateState: 9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current state against the definition 9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt, 9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i, tmp, oldflags, errNr; 9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr oldstate = NULL, state; 9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) { 9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NODEFINE); 9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ctxt->state->seq; 9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = NULL; 9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->depth; i++) 9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " "); 9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Start validating %s ", xmlRelaxNGDefName(define)); 9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s ", define->name); 9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && (node->name != NULL)) 9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name); 9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "\n"); 9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->depth++; 9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && 9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node->type == XML_TEXT_NODE) || 9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_COMMENT_NODE) || 9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_PI_NODE) || 9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE))) 9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->next; 9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = node; 9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name); 9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) { 9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOTELEM); 9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This node was already validated successfully against 9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this definition. 9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->psvi == define) { 9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); 9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr != 0) { 9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ctxt->err != NULL) && 9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) 9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(ctxt->err->arg2, node->name))) 9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || 9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->err->err == 9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ERR_ELEMEXTRANS) 9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(ctxt->err->arg1, node->name))) 9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) 9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || (ctxt->err->err == 9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ERR_NOTELEM))) 9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPop(ctxt); 9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGElementMatch(ctxt, define, node); 9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret <= 0) { 9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr != 0) { 9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ctxt->err != NULL) && 9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && 9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->err->arg2, node->name))) || 9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && 9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->err->arg1, node->name))) || 9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || 9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) 9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPop(ctxt); 9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & FLAGS_MIXED_CONTENT) { 9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags -= FLAGS_MIXED_CONTENT; 9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, node); 9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->attrs != NULL) { 9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); 9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); 9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel != NULL) { 9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state; 9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr tmpstates = ctxt->states; 9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr nseq; 9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nstate = xmlRelaxNGNewValidState(ctxt, node); 9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = nstate; 9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGValidateCompiledContent(ctxt, 9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->contModel, 9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nseq = ctxt->state->seq; 9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = tmpstate; 9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = tmpstates; 9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, nstate); 9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Validating content of '%s' : %d\n", 9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->name, tmp); 9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = -1; 9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = nseq; 9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validation error, log the message for the "best" one 9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGLogBestError(ctxt); 9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states-> 9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tabState[i]); 9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (tmp == -1)) 9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = nseq; 10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->content != NULL) { 10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGValidateDefinitionList(ctxt, 10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define-> 10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content); 10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state == NULL) { 10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, 10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name); 10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, 10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name); 10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = -1; 10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validation error, log the message for the "best" one 10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGLogBestError(ctxt); 10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 10044df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[i]); 10045df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[i] = NULL; 10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (tmp == -1)) 10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->psvi = define; 10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldstate != NULL) 10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); 10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -2; 10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateDefinition(): validated %s : %d", 10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name, ret); 10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldstate == NULL) 10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": no state\n"); 10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (oldstate->seq == NULL) 10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": done\n"); 10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (oldstate->seq->type == XML_ELEMENT_NODE) 10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": next elem %s\n", 10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate->seq->name); 10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": next %s %d\n", 10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate->seq->name, oldstate->seq->type); 10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL:{ 10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); 10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateDefinitionList(ctxt, 10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->content); 10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); 10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = xmlRelaxNGNewStates(ctxt, 1); 10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) { 10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); 10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state); 10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); 10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE:{ 10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int progress; 10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states = NULL, res = NULL; 10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int base, j; 10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlRelaxNGNewStates(ctxt, 1); 10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) { 10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All the input states are also exit states 10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCopyValidState(ctxt, 10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt-> 10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state)); 10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; j++) { 10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10167df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGCopyValidState(ctxt, 10168df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[j])); 10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 0; 10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = res->nbState; 10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < states->nbState; i++) { 10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = states->tabState[i]; 10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, 10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define-> 10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content); 10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGAddStates(ctxt, res, 10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state); 10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; 10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j++) { 10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10197df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[j]); 10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, 10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states); 10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state); 10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, 10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define-> 10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content); 10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = res->nbState; 10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGAddStates(ctxt, res, 10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state); 10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; j++) { 10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGAddStates(ctxt, res, 10231df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[j]); 10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, 10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states); 10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (progress) { 10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Collect all the new nodes added at that step 10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and make them the new node set 10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->nbState - base == 1) { 10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlRelaxNGCopyValidState(ctxt, 10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res-> 10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tabState 10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project [base]); 10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNewStates(ctxt, 10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res->nbState - base); 10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 0; 10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->nbState = 0; 10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = base; i < res->nbState; i++) 10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, states, 10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCopyValidState 10269df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt, res->tabState[i])); 10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = states; 10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (progress == 1); 10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states != NULL) { 10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = res; 10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors may have to be propagated back... 10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = NULL; 10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states = NULL; 10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->dflags & IS_TRIABLE) && (define->data != NULL) && 10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node != NULL)) { 10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node == NULL can't be optimized since IS_TRIABLE 10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't account for choice which may lead to 10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only attributes. 10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr triage = 10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashTablePtr) define->data; 10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Something we can optimize cleanly there is only one 10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possble branch out ! 10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_TEXT_NODE) || 10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE)) { 10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, BAD_CAST "#text", NULL); 10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (node->type == XML_ELEMENT_NODE) { 10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns != NULL) { 10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = xmlHashLookup2(triage, node->name, 10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->ns->href); 10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, BAD_CAST "#any", 10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->ns->href); 10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, node->name, NULL); 10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, BAD_CAST "#any", 10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name); 10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, list); 10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); 10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, list); 10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = xmlRelaxNGNewStates(ctxt, 1); 10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, states, ctxt->state); 10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, states, 10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states-> 10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tabState[i]); 10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states != NULL) { 10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = states; 10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); 10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateInterleave(ctxt, define); 10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateAttribute(ctxt, define); 10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, define->content); 10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE:{ 10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content = NULL; 10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node; 10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_DATAELEM, 10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name); 10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((child->type == XML_TEXT_NODE) || 10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) { 10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrcat(content, child->content); 10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle entities ... */ 10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrdup(BAD_CAST ""); 10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDatatype(ctxt, content, define, 10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name); 10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE:{ 10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content = NULL; 10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue; 10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node; 10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_VALELEM, 10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name); 10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((child->type == XML_TEXT_NODE) || 10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) { 10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrcat(content, child->content); 10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle entities ... */ 10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrdup(BAD_CAST ""); 10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = content; 10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, define); 10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name); 10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST:{ 10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content; 10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue, *oldendvalue; 10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Make sure it's only text nodes 10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = NULL; 10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node; 10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_LISTELEM, 10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name); 10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((child->type == XML_TEXT_NODE) || 10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) { 10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrcat(content, child->content); 10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle entities ... */ 10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrdup(BAD_CAST ""); 10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlStrlen(content); 10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldendvalue = ctxt->state->endvalue; 10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = content; 10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = content + len; 10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, define); 10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = oldendvalue; 10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_LIST); 10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((ret == 0) && (node != NULL)) { 10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = node->next; 10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = -1; 10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->depth--; 10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->depth; i++) 10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " "); 10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Validating %s ", xmlRelaxNGDefName(define)); 10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s ", define->name); 10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "suceeded\n"); 10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "failed\n"); 10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinition: 10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current node lists against the definition 10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states, res; 10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, k, ret, oldflags; 10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should NOT have both ctxt->state and ctxt->states 10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) { 10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = ctxt->states->tabState[0]; 10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateState(ctxt, define); 10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) { 10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = ctxt->states->tabState[0]; 10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j = 0; 10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < states->nbState; i++) { 10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = states->tabState[i]; 10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateState(ctxt, define); 10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should NOT have both ctxt->state and ctxt->states 10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) { 10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add the state to the container */ 10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, ctxt->state); 10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add the state directly in states */ 10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[j++] = ctxt->state; 10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) { 10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* make it the new container and copy other results */ 10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = ctxt->states; 10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < j; k++) 10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[k]); 10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add all the new results to res and reff the container */ 10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->states->nbState; k++) 10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[k]); 10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->states->nbState; k++) 10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[k]); 10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = res; 10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (j > 1) { 10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->nbState = j; 10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = states; 10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (j == 1) { 10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = states->tabState[0]; 10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDocument: 10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given document 10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) 10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; 10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; 10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL)) 10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_OK; 10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = ctxt->schema; 10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = schema->topgrammar; 10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) { 10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, NULL); 10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start); 10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (state->seq != NULL)) { 10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = state->seq; 10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node != NULL) { 10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != -1) { 10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); 10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp = -1; 10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = state->seq; 10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == -1) { 10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != -1) { 10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); 10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->errNr != 0) { 10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error(ctxt->userData, 10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "%d Extra error messages left on stack !\n", 10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr); 10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->idref == 1) { 10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidCtxt vctxt; 10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&vctxt, 0, sizeof(xmlValidCtxt)); 10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.valid = 1; 10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.error = ctxt->error; 10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.warning = ctxt->warning; 10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.userData = ctxt->userData; 10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateDocumentFinal(&vctxt, doc) != 1) 10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK)) 10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10791df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 10792df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGCleanPSVI: 10793df143a5041f03a22808b59c76698770b74692815Selim Gurun * @node: an input element or document 10794df143a5041f03a22808b59c76698770b74692815Selim Gurun * 10795df143a5041f03a22808b59c76698770b74692815Selim Gurun * Call this routine to speed up XPath computation on static documents. 10796df143a5041f03a22808b59c76698770b74692815Selim Gurun * This stamps all the element nodes with the document order 10797df143a5041f03a22808b59c76698770b74692815Selim Gurun * Like for line information, the order is kept in the element->content 10798df143a5041f03a22808b59c76698770b74692815Selim Gurun * field, the value stored is actually - the node number (starting at -1) 10799df143a5041f03a22808b59c76698770b74692815Selim Gurun * to be able to differentiate from line numbers. 10800df143a5041f03a22808b59c76698770b74692815Selim Gurun * 10801df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the number of elements found in the document or -1 in case 10802df143a5041f03a22808b59c76698770b74692815Selim Gurun * of error. 10803df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 10804df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 10805df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGCleanPSVI(xmlNodePtr node) { 10806df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlNodePtr cur; 10807df143a5041f03a22808b59c76698770b74692815Selim Gurun 10808df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((node == NULL) || 10809df143a5041f03a22808b59c76698770b74692815Selim Gurun ((node->type != XML_ELEMENT_NODE) && 10810df143a5041f03a22808b59c76698770b74692815Selim Gurun (node->type != XML_DOCUMENT_NODE) && 10811df143a5041f03a22808b59c76698770b74692815Selim Gurun (node->type != XML_HTML_DOCUMENT_NODE))) 10812df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 10813df143a5041f03a22808b59c76698770b74692815Selim Gurun if (node->type == XML_ELEMENT_NODE) 10814df143a5041f03a22808b59c76698770b74692815Selim Gurun node->psvi = NULL; 10815df143a5041f03a22808b59c76698770b74692815Selim Gurun 10816df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = node->children; 10817df143a5041f03a22808b59c76698770b74692815Selim Gurun while (cur != NULL) { 10818df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_ELEMENT_NODE) { 10819df143a5041f03a22808b59c76698770b74692815Selim Gurun cur->psvi = NULL; 10820df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->children != NULL) { 10821df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->children; 10822df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 10823df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10824df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10825df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->next != NULL) { 10826df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->next; 10827df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 10828df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10829df143a5041f03a22808b59c76698770b74692815Selim Gurun do { 10830df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->parent; 10831df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) 10832df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 10833df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == node) { 10834df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = NULL; 10835df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 10836df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10837df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->next != NULL) { 10838df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->next; 10839df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 10840df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10841df143a5041f03a22808b59c76698770b74692815Selim Gurun } while (cur != NULL); 10842df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10843df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 10844df143a5041f03a22808b59c76698770b74692815Selim Gurun} 10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1084694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 1084794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Validation interfaces * 1084894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidCtxt: 10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a precompiled XML RelaxNGs 10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs validation context based on the given schema 10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error 10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidCtxtPtr 10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) 10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxtPtr ret; 10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt)); 10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(NULL, "building context\n"); 10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGValidCtxt)); 10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->schema = schema; 10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = xmlGenericError; 10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errNr = 0; 10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errMax = 0; 10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->err = NULL; 10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errTab = NULL; 10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema != NULL) 10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->idref = schema->idref; 10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->states = NULL; 10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->freeState = NULL; 10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->freeStates = NULL; 10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errNo = XML_RELAXNG_OK; 10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidCtxt: 10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context 10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context 10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) 10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int k; 10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) 10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(NULL, ctxt->states); 10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeState != NULL) { 10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->freeState->nbState; k++) { 10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]); 10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(NULL, ctxt->freeState); 10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeStates != NULL) { 10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->freeStatesNr; k++) { 10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]); 10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->freeStates); 10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab != NULL) 10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->errTab); 10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab != NULL) { 10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRelaxNGElemPop(ctxt); 10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (exec != NULL) { 10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRelaxNGElemPop(ctxt); 10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->elemTab); 10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidErrors: 10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error function 10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function 10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context 10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the error and warning callback informations 10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, 10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc err, 10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warn, void *ctx) 10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = err; 10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = warn; 10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = NULL; 10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidStructuredErrors: 10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror: the structured error function 10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context 10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback 10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, 10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror, void *ctx) 10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = serror; 10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = NULL; 10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = NULL; 10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetValidErrors: 10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error function result 10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function result 10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context result 10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the error and warning callback informations 10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error and 0 otherwise 10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, 10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc * err, 10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc * warn, void **ctx) 10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err != NULL) 10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *err = ctxt->error; 10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (warn != NULL) 10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *warn = ctxt->warning; 10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx != NULL) 10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctx = ctxt->userData; 10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDoc: 10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a parsed document tree 11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a document tree in memory. 11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is valid, a positive error code 11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of internal or API error. 11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) 11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (doc == NULL)) 11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = doc; 11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDocument(ctxt, doc); 11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11019df143a5041f03a22808b59c76698770b74692815Selim Gurun * Remove all left PSVI 11020df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 11021df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGCleanPSVI((xmlNodePtr) doc); 11022df143a5041f03a22808b59c76698770b74692815Selim Gurun 11023df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: build error codes 11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) 11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_relaxng 11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */ 11034