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 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_RELAXNG(node, type) \ 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node != NULL) && (node->ns != NULL) && \ 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(node->name, (const xmlChar *) type)) && \ 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(node->ns->href, xmlRelaxNGNs))) 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG 1 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_GRAMMAR 1 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_CONTENT 1 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_TYPE 1 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID 1 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_INTERLEAVE 1 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_LIST 1 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_INCLUDE 1 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_ERROR 1 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_COMPILE 1 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_PROGRESSIVE 1 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ERROR 5 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO \ 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGSchema xmlRelaxNGSchema; 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr; 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDefine xmlRelaxNGDefine; 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr; 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDocument xmlRelaxNGDocument; 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr; 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInclude xmlRelaxNGInclude; 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr; 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_COMBINE_UNDEFINED = 0, /* undefined */ 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_COMBINE_CHOICE, /* choice */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_COMBINE_INTERLEAVE /* interleave */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGCombine; 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_ERROR = -1, 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_EMPTY = 0, 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_SIMPLE, 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CONTENT_COMPLEX 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGContentType; 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar; 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr; 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGGrammar { 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr parent; /* the parent grammar if any */ 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr children; /* the children grammar if any */ 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr next; /* the next grammar if any */ 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr start; /* <start> content */ 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCombine combine; /* the default combine value */ 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr startList; /* list of <start> definitions */ 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr defs; /* define* */ 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr refs; /* references */ 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_NOOP = -1, /* a no operation from simplification */ 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_EMPTY = 0, /* an empty pattern */ 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_NOT_ALLOWED, /* not allowed top */ 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_EXCEPT, /* except present in nameclass defs */ 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_TEXT, /* textual content */ 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ELEMENT, /* an element */ 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_DATATYPE, /* extenal data type definition */ 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_PARAM, /* extenal data type parameter */ 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_VALUE, /* value from an extenal data type definition */ 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_LIST, /* a list of patterns */ 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ATTRIBUTE, /* an attrbute following a pattern */ 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_DEF, /* a definition */ 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_REF, /* reference to a definition */ 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_EXTERNALREF, /* reference to an external def */ 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_PARENTREF, /* reference to a def in the parent grammar */ 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_OPTIONAL, /* optional patterns */ 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ZEROORMORE, /* zero or more non empty patterns */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ONEORMORE, /* one or more non empty patterns */ 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_CHOICE, /* a choice between non empty patterns */ 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_GROUP, /* a pair/group of non empty patterns */ 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_INTERLEAVE, /* interleaving choice of non-empty patterns */ 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_START /* Used to keep track of starts on grammars */ 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGType; 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NULLABLE (1 << 0) 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_NULLABLE (1 << 1) 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_INDETERMINIST (1 << 2) 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_MIXED (1 << 3) 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_TRIABLE (1 << 4) 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_PROCESSED (1 << 5) 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_COMPILABLE (1 << 6) 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_COMPILABLE (1 << 7) 152df143a5041f03a22808b59c76698770b74692815Selim Gurun#define IS_EXTERNAL_REF (1 << 8) 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDefine { 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGType type; /* the type of definition */ 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the node in the source */ 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; /* the element local name if present */ 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns; /* the namespace local name if present */ 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; /* value when available */ 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; /* data lib or specific pointer */ 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr content; /* the expected content */ 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr parent; /* the parent definition, if any */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr next; /* list within grouping sequences */ 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr attrs; /* list of attributes for elements */ 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr nameClass; /* the nameClass definition if any */ 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr nextHash; /* next define in defs/refs hash tables */ 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project short depth; /* used for the cycle detection */ 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project short dflags; /* define related flags */ 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr contModel; /* a compiled content model if available */ 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlRelaxNG: 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs definition 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNG { 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *_private; /* unused by the library for users or bindings */ 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr topgrammar; 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idref; /* requires idref checking */ 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr defs; /* define */ 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr refs; /* references */ 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr includes; /* all the includes loaded */ 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int defNr; /* number of defines used */ 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ATTRIBUTE (1 << 0) 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ONEORMORE (1 << 1) 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_LIST (1 << 2) 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_DATAEXCEPT (1 << 3) 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_START (1 << 4) 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMGROUP (1 << 5) 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6) 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_EXTERNALREF (1 << 7) 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ANYEXCEPT (1 << 8) 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_NSEXCEPT (1 << 9) 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGParserCtxt { 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userData; /* user specific data block */ 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err; 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* The schema in use */ 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; /* the current grammar */ 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */ 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* parser flags */ 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbErrors; /* number of errors at parse time */ 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbWarnings; /* number of warnings at parse time */ 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *define; /* the current define scope */ 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; /* the current define */ 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbInterleaves; 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr interleaves; /* keep track of all the interleaves */ 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr includes; /* all the includes loaded */ 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URL; 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr document; 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int defNr; /* number of defines used */ 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int defMax; /* number of defines aloocated */ 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *buffer; 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the document stack */ 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr doc; /* Current parsed external ref */ 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int docNr; /* Depth of the parsing stack */ 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int docMax; /* Max depth of the parsing stack */ 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr *docTab; /* array of docs */ 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the include stack */ 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr inc; /* Current parsed include */ 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int incNr; /* Depth of the include parsing stack */ 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int incMax; /* Max depth of the parsing stack */ 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr *incTab; /* array of incs */ 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idref; /* requires idref checking */ 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* used to compile content models */ 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr am; /* the automata */ 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr state; /* used to build the automata */ 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int crng; /* compact syntax and other flags */ 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int freedoc; /* need to free the document */ 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_IGNORABLE 1 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NEGATIVE 2 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_MIXED_CONTENT 4 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NOERROR 8 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInterleaveGroup: 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition set associated to lists of definitions 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup; 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr; 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInterleaveGroup { 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr rule; /* the rule to satisfy */ 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *defs; /* the array of element definitions */ 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */ 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_DETERMINIST 1 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NEEDCHECK 2 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPartitions: 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition associated to an interleave group 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGPartition xmlRelaxNGPartition; 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr; 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGPartition { 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbgroups; /* number of groups in the partitions */ 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr triage; /* hash table used to direct nodes to the 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * right group when possible */ 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* determinist ? */ 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr *groups; 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidState: 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation state 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ATTR 20 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidState xmlRelaxNGValidState; 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr; 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidState { 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the current node */ 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr seq; /* the sequence of children left to validate */ 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAttrs; /* the number of attributes */ 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxAttrs; /* the size of attrs */ 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAttrLeft; /* the number of attributes left to validate */ 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; /* the value when operating on string */ 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *endvalue; /* the end value when operating on string */ 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *attrs; /* the array of attributes */ 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGStates: 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs container for validation state 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGStates xmlRelaxNGStates; 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGStates *xmlRelaxNGStatesPtr; 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGStates { 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbState; /* the number of states */ 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxState; /* the size of the array */ 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr *tabState; 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR_IS_DUP 1 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidError: 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation error 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidError xmlRelaxNGValidError; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr; 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidError { 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err; /* the error number */ 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* flags */ 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the current node */ 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr seq; /* the current child */ 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *arg1; /* first arg */ 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *arg2; /* second arg */ 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidCtxt: 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation context 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidCtxt { 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userData; /* user specific data block */ 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror; 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbErrors; /* number of errors in validation */ 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* The schema in use */ 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* the document being validated */ 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* validation flags */ 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth; /* validation depth */ 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idref; /* requires idref checking */ 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errNo; /* the first error found */ 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Errors accumulated in branches may have to be stacked to be 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * provided back when it's sure they affect validation. 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr err; /* Last error */ 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errNr; /* Depth of the error stack */ 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errMax; /* Max depth of the error stack */ 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr errTab; /* stack of errors */ 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; /* the current validation state */ 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states; /* the accumulated state list */ 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr freeState; /* the pool of free valid states */ 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int freeStatesNr; 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int freeStatesMax; 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr *freeStates; /* the pool of free state groups */ 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is used for "progressive" validation 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr elem; /* the current element regexp */ 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int elemNr; /* the number of element validated */ 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int elemMax; /* the max depth of elements */ 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */ 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int pstate; /* progressive state */ 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr pnode; /* the current node */ 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr pdef; /* the non-streamable definition */ 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int perr; /* signal error in content model 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * outside the regexp */ 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInclude: 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInclude { 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr next; /* keep a chain of includes */ 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href; /* the normalized href value */ 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* the associated XML document */ 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr content; /* the definitions */ 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* the schema */ 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocument: 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDocument { 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr next; /* keep a chain of documents */ 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href; /* the normalized href value */ 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* the associated XML document */ 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr content; /* the definitions */ 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; /* the schema */ 418df143a5041f03a22808b59c76698770b74692815Selim Gurun int externalRef; /* 1 if an external ref */ 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 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 * Some factorized error routines * 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErrMemory: 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an Relax-NG parser context 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra) 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGP, 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGP, 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErrMemory: 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra) 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGV, 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_RELAXNGV, 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErr: 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: message 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra info 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra info 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Parsing error 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error, 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, const xmlChar * str2) 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, node, XML_FROM_RELAXNGP, 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error, XML_ERR_ERROR, NULL, 0, 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, (const char *) str2, NULL, 0, 0, 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, str1, str2); 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErr: 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: message 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra info 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra info 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Validation error 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error, 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, const xmlChar * str2) 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->serror != NULL) 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbErrors++; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, node, XML_FROM_RELAXNGV, 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error, XML_ERR_ERROR, NULL, 0, 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, (const char *) str2, NULL, 0, 0, 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, str1, str2); 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Preliminary type checking interfaces * 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeHave: 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a type is exported 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type); 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCheck: 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result: place to store the result if needed 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a value match a type 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type, 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value, void **result, 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node); 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFacetCheck: 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the facet name 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the facet value 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval: the string value 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type, 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * facet, 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * val, 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * strval, void *value); 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeFree: 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result: the value to free 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a returned result 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef void (*xmlRelaxNGTypeFree) (void *data, void *result); 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCompare: 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1: the first value 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to compare two values accordingly 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to a type. 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type, 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value1, 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt1, 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *comp1, 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value2, 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt2); 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary; 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr; 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGTypeLibrary { 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *namespace; /* the datatypeLibrary value */ 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; /* data needed for the library */ 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeHave have; /* the export function */ 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCheck check; /* the checking function */ 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCompare comp; /* the compare function */ 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFacetCheck facet; /* the facet check function */ 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeFree freef; /* the freeing function */ 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocation functions * 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar); 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGNormExtSpace(xmlChar * value); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema); 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ATTRIBUTE_UNUSED, 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state1, 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state2); 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state); 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocument: 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu: a document structure 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structure. 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu) 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu == NULL) 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->href != NULL) 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(docu->href); 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->doc != NULL) 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(docu->doc); 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->schema != NULL) 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeInnerSchema(docu->schema); 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(docu); 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocumentList: 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu: a list of document structure 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structures. 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu) 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr next; 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (docu != NULL) { 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = docu->next; 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocument(docu); 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu = next; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInclude: 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl: a include structure 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure. 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl) 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl == NULL) 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl->href != NULL) 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(incl->href); 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl->doc != NULL) 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(incl->doc); 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl->schema != NULL) 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFree(incl->schema); 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(incl); 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeIncludeList: 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl: a include structure list 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure. 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl) 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr next; 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (incl != NULL) { 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = incl->next; 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeInclude(incl); 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project incl = next; 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewRelaxNG: 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context (optional) 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG structure. 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt) 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr ret; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG)); 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, NULL); 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNG)); 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInnerSchema: 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG schema structure. 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema) 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc != NULL) 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(schema->doc); 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->defTab != NULL) { 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < schema->defNr; i++) 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDefine(schema->defTab[i]); 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema->defTab); 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema); 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFree: 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG structure. 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFree(xmlRelaxNGPtr schema) 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar != NULL) 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeGrammar(schema->topgrammar); 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc != NULL) 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(schema->doc); 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->documents != NULL) 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocumentList(schema->documents); 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->includes != NULL) 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeIncludeList(schema->includes); 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->defTab != NULL) { 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < schema->defNr; i++) 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDefine(schema->defTab[i]); 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema->defTab); 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema); 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewGrammar: 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context (optional) 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG grammar. 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt) 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr ret; 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar)); 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, NULL); 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGGrammar)); 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeGrammar: 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar: a grammar structure 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG grammar structure. 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar) 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->children != NULL) { 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeGrammar(grammar->children); 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->next != NULL) { 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeGrammar(grammar->next); 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->refs != NULL) { 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(grammar->refs, NULL); 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->defs != NULL) { 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(grammar->defs, NULL); 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(grammar); 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDefine: 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node in the input document. 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG define. 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret; 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->defMax == 0) { 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defMax = 16; 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defNr = 0; 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab = (xmlRelaxNGDefinePtr *) 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr)); 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->defTab == NULL) { 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating define\n"); 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->defMax <= ctxt->defNr) { 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *tmp; 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defMax *= 2; 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab, 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defMax * 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGDefinePtr)); 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating define\n"); 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab = tmp; 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine)); 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating define\n"); 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGDefine)); 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab[ctxt->defNr++] = ret; 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = node; 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->depth = -1; 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreePartition: 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @partitions: a partition set structure 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate RelaxNG partition set structures. 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions) 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr group; 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j; 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions != NULL) { 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->groups != NULL) { 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < partitions->nbgroups; j++) { 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[j]; 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group != NULL) { 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group->defs != NULL) 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(group->defs); 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group->attrs != NULL) 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(group->attrs); 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(group); 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(partitions->groups); 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->triage != NULL) { 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(partitions->triage, NULL); 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(partitions); 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDefine: 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: a define structure 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG define structure. 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define) 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) { 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) define->data; 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((lib != NULL) && (lib->freef != NULL)) 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef(lib->data, (void *) define->attrs); 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE)) 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data); 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE)) 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree((xmlHashTablePtr) define->data, NULL); 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define->name); 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define->ns); 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->value != NULL) 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define->value); 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel != NULL) 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRegexp(define->contModel); 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(define); 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewStates: 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the default size for the container 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state container 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGStatesPtr 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size) 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr ret; 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && 1011df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->freeStates != NULL) && (ctxt->freeStatesNr > 0)) { 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesNr--; 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->freeStates[ctxt->freeStatesNr]; 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbState = 0; 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size < 16) 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = 16; 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) + 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size - 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1) * 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRelaxNGValidStatePtr)); 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbState = 0; 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxState = size; 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) * 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr)); 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->tabState == NULL) { 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddStateUniq: 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states: the states container 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: the validation state 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container without checking 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for unicity. 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt, 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states, 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states->nbState >= states->maxState) { 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr *tmp; 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = states->maxState * 2; 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size) * 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr)); 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "adding states\n"); 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState = tmp; 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->maxState = size; 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[states->nbState++] = state; 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddState: 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states: the states container 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: the validation state 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt, 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states, 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states->nbState >= states->maxState) { 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr *tmp; 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = states->maxState * 2; 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size) * 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr)); 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "adding states\n"); 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState = tmp; 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->maxState = size; 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < states->nbState; i++) { 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) { 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[states->nbState++] = state; 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeStates: 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states: teh container 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a RelaxNG validation state container 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt, 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states) 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->freeStates == NULL)) { 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesMax = 40; 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesNr = 0; 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStates = (xmlRelaxNGStatesPtr *) 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr)); 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeStates == NULL) { 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "storing states\n"); 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((ctxt != NULL) 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) { 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr *tmp; 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates, 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * ctxt->freeStatesMax * 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGStatesPtr)); 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "storing states\n"); 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states->tabState); 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states); 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStates = tmp; 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStatesMax *= 2; 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->freeStates == NULL)) { 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states->tabState); 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states); 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeStates[ctxt->freeStatesNr++] = states; 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidState: 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current node or NULL for the document 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node) 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr ret; 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attrs[MAX_ATTR]; 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAttrs = 0; 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root = NULL; 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(ctxt->doc); 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = node->properties; 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs < MAX_ATTR) 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrs[nbAttrs++] = attr; 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbAttrs++; 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->next; 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeState->nbState--; 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr) 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGValidState)); 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGValidState)); 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->value = NULL; 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->endvalue = NULL; 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = (xmlNodePtr) ctxt->doc; 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->seq = root; 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = node; 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->seq = node->children; 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = 0; 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs > 0) { 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs < 4) 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = 4; 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = nbAttrs; 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret->maxAttrs < nbAttrs) { 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *tmp; 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs * 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = tmp; 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = nbAttrs; 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = nbAttrs; 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbAttrs < MAX_ATTR) { 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs); 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = node->properties; 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbAttrs = 0; 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs[nbAttrs++] = attr; 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->next; 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrLeft = ret->nbAttrs; 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCopyValidState: 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a validation state 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy the validation state 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt, 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr ret; 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int maxAttrs; 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *attrs; 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeState->nbState--; 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidStatePtr) 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGValidState)); 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGValidState)); 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrs = ret->attrs; 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxAttrs = ret->maxAttrs; 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret, state, sizeof(xmlRelaxNGValidState)); 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = attrs; 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = maxAttrs; 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbAttrs > 0) { 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = state->maxAttrs; 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->attrs == NULL) { 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = 0; 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret->maxAttrs < state->nbAttrs) { 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr *tmp; 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs * 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlAttrPtr)); 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "allocating states\n"); 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAttrs = 0; 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxAttrs = state->maxAttrs; 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = tmp; 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret->attrs, state->attrs, 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nbAttrs * sizeof(xmlAttrPtr)); 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGEqualValidState: 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state1: a validation state 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state2: a validation state 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the validation states for equality 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equald, 0 otherwise 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state1, 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state2) 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state1 == NULL) || (state2 == NULL)) 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1 == state2) 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->node != state2->node) 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->seq != state2->seq) 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->nbAttrLeft != state2->nbAttrLeft) 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->nbAttrs != state2->nbAttrs) 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->endvalue != state2->endvalue) 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state1->value != state2->value) && 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(state1->value, state2->value))) 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < state1->nbAttrs; i++) { 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state1->attrs[i] != state2->attrs[i]) 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidState: 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a validation state structure 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG validation state structure. 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state) 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->freeState == NULL)) { 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40); 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->freeState == NULL)) { 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->attrs != NULL) 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state->attrs); 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state); 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state); 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Semi internal functions * 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxParserSetFlag: 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a RelaxNG parser context 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: a set of flags values 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Semi private function used to pass informations to a parser context 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which are a combination of xmlRelaxNGParserFlag . 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags) 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(-1); 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNGP_FREE_DOC) { 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->crng |= XML_RELAXNGP_FREE_DOC; 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags -= XML_RELAXNGP_FREE_DOC; 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNGP_CRNG) { 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->crng |= XML_RELAXNGP_CRNG; 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags -= XML_RELAXNGP_CRNG; 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags != 0) return(-1); 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Document functions * 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc); 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePush: 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the element doc 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new include on top of the include stack 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt, 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr value) 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab == NULL) { 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incMax = 4; 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incNr = 0; 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab = 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGIncludePtr *) xmlMalloc(ctxt->incMax * 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->incTab[0])); 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab == NULL) { 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating include\n"); 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incNr >= ctxt->incMax) { 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incMax *= 2; 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab = 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGIncludePtr *) xmlRealloc(ctxt->incTab, 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incMax * 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->incTab[0])); 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab == NULL) { 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating include\n"); 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab[ctxt->incNr] = value; 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = value; 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->incNr++); 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePop: 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top include from the include stack 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the include just removed 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt) 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr ret; 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incNr <= 0) 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incNr--; 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incNr > 0) 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = ctxt->incTab[ctxt->incNr - 1]; 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = NULL; 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->incTab[ctxt->incNr]; 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->incTab[ctxt->incNr] = NULL; 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRemoveRedefine: 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the normalized URL 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @target: the included target 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the define name to eliminate 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the elimination algorithm of 4.7 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, 1 in case of success. 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt, 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * URL ATTRIBUTE_UNUSED, 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr target, const xmlChar * name) 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp, tmp2; 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name2; 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Elimination of <include> start from %s\n", URL); 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Elimination of <include> define %s from %s\n", 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, URL); 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = target; 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = tmp->next; 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) { 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(tmp); 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(tmp); 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) { 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name2 = xmlGetProp(tmp, BAD_CAST "name"); 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(name2); 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name2 != NULL) { 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, name2)) { 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(tmp); 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(tmp); 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name2); 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(tmp, "include")) { 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href = NULL; 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr inc = tmp->psvi; 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((inc != NULL) && (inc->doc != NULL) && 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (inc->doc->children != NULL)) { 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (inc->doc->children->name, BAD_CAST "grammar")) { 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetProp(tmp, BAD_CAST "href"); 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGRemoveRedefine(ctxt, href, 1564df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlDocGetRootElement(inc->doc)->children, 1565df143a5041f03a22808b59c76698770b74692815Selim Gurun name) == 1) { 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp2; 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (found); 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadInclude: 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the normalized URL 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the include node. 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace passed from the context. 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context, 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller. 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGIncludePtr or NULL in case of error 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL, 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, const xmlChar * ns) 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr ret = NULL; 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root, cur; 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGLoadInclude(%s)\n", URL); 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion in the stack 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->incNr; i++) { 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->incTab[i]->href, URL)) { 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_INCLUDE_RECURSE, 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Detected an Include recursion for %s\n", URL, 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * load the document 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) URL,NULL,0); 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARSE_ERROR, 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: could not load %s\n", URL, NULL); 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL); 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the document structures and register it first. 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude)); 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "allocating include\n"); 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGInclude)); 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->href = xmlStrdup(URL); 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = ctxt->includes; 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes = ret; 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transmit the ns if needed 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != NULL) { 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHasProp(root, BAD_CAST "ns") == NULL) { 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(root, BAD_CAST "ns", ns); 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 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 * push it on the stack 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePush(ctxt, ret); 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some preprocessing of the document content, this include recursing 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the include stack. 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL); 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlRelaxNGCleanupDoc(ctxt, doc); 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inc = NULL; 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop up the include from the stack 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePop(ctxt); 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL); 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that the top element is a grammar 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: included document is empty %s\n", URL, 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_RELAXNG(root, "grammar")) { 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: included document %s root is not a grammar\n", 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, NULL); 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Elimination of redefined rules in the include. 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node->children; 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(cur, "start")) { 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL); 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!found) { 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_START_MISSING, 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: include %s has a start but not the included grammar\n", 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, NULL); 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(cur, "define")) { 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlGetProp(cur, BAD_CAST "name"); 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_NAME_MISSING, 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: include %s has define without name\n", 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, NULL); 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found; 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(name); 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = xmlRelaxNGRemoveRedefine(ctxt, URL, 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root->children, name); 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!found) { 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_MISSING, 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: include %s has a define %s but not the included grammar\n", 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL, name); 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPush: 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error code 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first string argument 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second string argument 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup: arg need to be duplicated 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new error on top of the error stack 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt, 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err, const xmlChar * arg1, 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2, int dup) 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr cur; 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Pushing error %d at %d on stack\n", err, ctxt->errNr); 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab == NULL) { 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errMax = 8; 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr = 0; 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errTab = 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidErrorPtr) xmlMalloc(ctxt->errMax * 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidError)); 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab == NULL) { 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "pushing error\n"); 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr >= ctxt->errMax) { 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errMax *= 2; 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errTab = 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab, 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errMax * 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGValidError)); 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab == NULL) { 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "pushing error\n"); 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->err != NULL) && (ctxt->state != NULL) && 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err)) 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->errNr); 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &ctxt->errTab[ctxt->errNr]; 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->err = err; 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dup) { 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg1 = xmlStrdup(arg1); 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg2 = xmlStrdup(arg2); 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = ERROR_IS_DUP; 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg1 = arg1; 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg2 = arg2; 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = 0; 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->node = ctxt->state->node; 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->seq = ctxt->state->seq; 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->node = NULL; 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->seq = NULL; 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = cur; 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->errNr++); 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPop: 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top error from the error stack 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt) 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr cur; 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr <= 0) { 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr--; 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &ctxt->errTab[ctxt->errNr]; 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->flags & ERROR_IS_DUP) { 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->arg1 != NULL) 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) cur->arg1); 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg1 = NULL; 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->arg2 != NULL) 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) cur->arg2); 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->arg2 = NULL; 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = 0; 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPush: 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the element doc 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new doc on top of the doc stack 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt, 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr value) 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab == NULL) { 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docMax = 4; 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docNr = 0; 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab = 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGDocumentPtr *) xmlMalloc(ctxt->docMax * 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->docTab[0])); 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab == NULL) { 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "adding document\n"); 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docNr >= ctxt->docMax) { 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docMax *= 2; 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab = 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGDocumentPtr *) xmlRealloc(ctxt->docTab, 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docMax * 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->docTab[0])); 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab == NULL) { 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "adding document\n"); 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab[ctxt->docNr] = value; 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = value; 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->docNr++); 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPop: 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top doc from the doc stack 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the doc just removed 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt) 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr ret; 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docNr <= 0) 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docNr--; 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docNr > 0) 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = ctxt->docTab[ctxt->docNr - 1]; 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = NULL; 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->docTab[ctxt->docNr]; 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->docTab[ctxt->docNr] = NULL; 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadExternalRef: 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the normalized URL 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the inherited ns if any 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context, 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller. 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDocumentPtr or NULL in case of error 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt, 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * URL, const xmlChar * ns) 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr ret = NULL; 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion in the stack 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->docNr; i++) { 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->docTab[i]->href, URL)) { 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE, 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Detected an externalRef recursion for %s\n", URL, 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * load the document 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) URL,NULL,0); 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: could not load %s\n", URL, NULL); 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the document structures and register it first. 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument)); 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY, 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL); 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGDocument)); 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->href = xmlStrdup(URL); 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = ctxt->documents; 1975df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->externalRef = 1; 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->documents = ret; 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transmit the ns if needed 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != NULL) { 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHasProp(root, BAD_CAST "ns") == NULL) { 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(root, BAD_CAST "ns", ns); 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 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 * push it on the stack and register it in the hash table 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPush(ctxt, ret); 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some preprocessing of the document content 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlRelaxNGCleanupDoc(ctxt, doc); 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = NULL; 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPop(ctxt); 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Error functions * 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0); 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0); 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0); 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1); 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1); 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char * 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefName(xmlRelaxNGDefinePtr def) 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("none"); 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("empty"); 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("notAllowed"); 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("except"); 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("text"); 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("element"); 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("datatype"); 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("value"); 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("list"); 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("attribute"); 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("def"); 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("ref"); 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("externalRef"); 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("parentRef"); 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("optional"); 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("zeroOrMore"); 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("oneOrMore"); 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("choice"); 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("group"); 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("interleave"); 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("start"); 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("noop"); 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("param"); 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ("unknown"); 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetErrorString: 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error code 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first string argument 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second string argument 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computes a formatted error string for the given error code and args 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the error string, it must be deallocated by the caller 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1, 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2) 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char msg[1000]; 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 == NULL) 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = BAD_CAST ""; 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2 == NULL) 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = BAD_CAST ""; 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg[0] = 0; 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (err) { 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OK: 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_MEMORY: 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("out of memory\n")); 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TYPE: 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "failed to validate type %s\n", arg1); 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TYPEVAL: 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1, 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2); 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_DUPID: 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "ID %s redefined\n", arg1); 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TYPECMP: 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "failed to compare type %s\n", arg1); 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOSTATE: 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Internal error: no state\n")); 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NODEFINE: 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Internal error: no define\n")); 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTERNAL: 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Internal error: %s\n", arg1); 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LISTEXTRA: 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Extra data in list: %s\n", arg1); 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTERNODATA: 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ("Internal: interleave block has no data\n")); 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTERSEQ: 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Invalid sequence in interleave\n")); 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INTEREXTRA: 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Extra element %s in interleave\n", arg1); 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMNAME: 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1, 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2); 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMNONS: 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting a namespace for element %s\n", 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMWRONGNS: 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has wrong namespace: expecting %s\n", arg1, 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2); 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMWRONG: 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Did not expect element %s there\n", arg1); 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_TEXTWRONG: 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Did not expect text in element %s content\n", arg1); 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMEXTRANS: 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting no namespace for element %s\n", 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ELEMNOTEMPTY: 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1); 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOELEM: 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Expecting an element %s, got nothing\n", 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOTELEM: 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Expecting an element got text\n")); 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_ATTRVALID: 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Element %s failed to validate attributes\n", 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_CONTENTVALID: 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Element %s failed to validate content\n", 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_EXTRACONTENT: 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Element %s has extra content: %s\n", 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1, arg2); 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_INVALIDATTR: 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Invalid attribute %s for element %s\n", 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1, arg2); 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LACKDATA: 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Datatype element %s contains no data\n", 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_DATAELEM: 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Datatype element %s has child elements\n", 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_VALELEM: 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Value element %s has child elements\n", 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LISTELEM: 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "List element %s has child elements\n", 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1); 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_DATATYPE: 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Error validating datatype %s\n", arg1); 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_VALUE: 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Error validating value %s\n", arg1); 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_LIST: 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Error validating list\n")); 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_NOGRAMMAR: 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("No top grammar defined\n")); 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ERR_EXTRADATA: 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Extra data in the document\n")); 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlCharStrdup("Unknown error !\n")); 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (msg[0] == 0) { 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 1000, "Unknown error code %d\n", err); 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg[1000 - 1] = 0; 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStrdup((xmlChar *) msg)); 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGShowValidError: 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error number 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child: the node child generating the problem. 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first argument 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second argument 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show a validation error. 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err, xmlNodePtr node, 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child, const xmlChar * arg1, 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2) 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *msg; 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & FLAGS_NOERROR) 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err); 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = xmlRelaxNGGetErrorString(err, arg1, arg2); 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (msg == NULL) 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_RELAXNG_OK) 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = err; 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErr(ctxt, (child == NULL ? node : child), err, 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) msg, arg1, arg2); 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(msg); 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPopErrors: 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @level: the error level in the stack 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pop and discard all errors until the given level is reached 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level) 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr err; 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Pop errors till level %d\n", level); 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = level; i < ctxt->errNr; i++) { 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err = &ctxt->errTab[i]; 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->flags & ERROR_IS_DUP) { 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg1 != NULL) 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg1); 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg1 = NULL; 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg2 != NULL) 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg2); 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg2 = NULL; 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->flags = 0; 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr = level; 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr <= 0) 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = NULL; 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpValidError: 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show all validation error over a given index. 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt) 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, k; 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPtr err, dup; 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Dumping error stack %d errors\n", ctxt->errNr); 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0, k = 0; i < ctxt->errNr; i++) { 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err = &ctxt->errTab[i]; 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (k < MAX_ERROR) { 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < i; j++) { 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dup = &ctxt->errTab[j]; 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((err->err == dup->err) && (err->node == dup->node) && 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(err->arg1, dup->arg1)) && 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(err->arg2, dup->arg2))) { 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip; 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq, 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg1, err->arg2); 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project k++; 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip: 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->flags & ERROR_IS_DUP) { 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg1 != NULL) 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg1); 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg1 = NULL; 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->arg2 != NULL) 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) err->arg2); 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->arg2 = NULL; 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->flags = 0; 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr = 0; 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddValidError: 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error number 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first argument 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second argument 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup: need to dup the args 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a validation error, either generating it if it's sure 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or stacking it for later handling if unsure. 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErr err, const xmlChar * arg1, 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * arg2, int dup) 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & FLAGS_NOERROR) 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err); 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * generate the error directly 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((ctxt->flags & FLAGS_IGNORABLE) == 0) || 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->flags & FLAGS_NEGATIVE)) { 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, seq; 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Flush first any stacked error which might be the 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * real cause of the problem. 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr != 0) 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ctxt->state->node; 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = ctxt->state->seq; 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = seq = NULL; 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2378df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((node == NULL) && (seq == NULL)) { 2379df143a5041f03a22808b59c76698770b74692815Selim Gurun node = ctxt->pnode; 2380df143a5041f03a22808b59c76698770b74692815Selim Gurun } 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2); 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Stack the error for later processing if needed 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup); 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 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 * * 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type library hooks * 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * str); 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeHave: 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library. 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type) 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NULL) 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCheck: 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library. 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED, 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value, 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **result, xmlNodePtr node) 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == NULL) || (value == NULL)) 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValPredefTypeNode(typ, value, 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlSchemaValPtr *) result, node); 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 2) /* special ID error code */ 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (2); 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret > 0) 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFacetCheck: 2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the facet name 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the facet value 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval: the string value 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED, 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, const xmlChar * facetname, 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * val, const xmlChar * strval, 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *value) 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFacetPtr facet; 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == NULL) || (strval == NULL)) 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet = xmlSchemaNewFacet(); 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (facet == NULL) 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) { 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MININCLUSIVE; 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) { 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) { 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) { 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) { 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_TOTALDIGITS; 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) { 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) { 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_PATTERN; 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) { 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_ENUMERATION; 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) { 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_WHITESPACE; 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "length")) { 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_LENGTH; 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) { 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MAXLENGTH; 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) { 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->type = XML_SCHEMA_FACET_MINLENGTH; 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeFacet(facet); 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project facet->value = val; 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaCheckFacet(facet, typ, NULL, type); 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeFacet(facet); 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValidateFacet(typ, facet, strval, value); 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeFacet(facet); 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFreeValue: 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to free 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a Schemas value 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value) 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(value); 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCompare: 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1: the first value 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values for equality accordingly a type from the W3C XMLSchema 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Datatype library. 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equal, 0 if no and -1 in case of error. 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value1, 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt1, 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *comp1, 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value2, xmlNodePtr ctxt2) 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaTypePtr typ; 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaValPtr res1 = NULL, res2 = NULL; 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == NULL) || (value1 == NULL) || (value2 == NULL)) 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project typ = xmlSchemaGetPredefinedType(type, 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"); 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (typ == NULL) 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp1 == NULL) { 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1); 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res1 == NULL) 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res1 = (xmlSchemaValPtr) comp1; 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp1 == NULL) && (res1 != NULL)) 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(res1); 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res1 == NULL) { 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchemaCompareValues(res1, res2); 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res1 != (xmlSchemaValPtr) comp1) 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(res1); 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaFreeValue(res2); 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -2) 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeHave: 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library. 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED, 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type) 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NULL) 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "string")) 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "token")) 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCheck: 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library. 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED, 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type ATTRIBUTE_UNUSED, 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value ATTRIBUTE_UNUSED, 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **result ATTRIBUTE_UNUSED, 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node ATTRIBUTE_UNUSED) 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "string")) 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "token")) { 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCompare: 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data needed for the library 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type name 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1: the first value 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values accordingly a type from the default 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * datatype library. 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED, 2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * type, 2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value1, 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt1 ATTRIBUTE_UNUSED, 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *comp1 ATTRIBUTE_UNUSED, 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value2, 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ctxt2 ATTRIBUTE_UNUSED) 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = -1; 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(type, BAD_CAST "string")) { 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(value1, value2); 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(type, BAD_CAST "token")) { 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(value1, value2)) { 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *nval, *nvalue; 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: trivial optimizations are possible by 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computing at compile-time 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nval = xmlRelaxNGNormalize(NULL, value1); 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nvalue = xmlRelaxNGNormalize(NULL, value2); 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nval == NULL) || (nvalue == NULL)) 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(nval, nvalue)) 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nval != NULL) 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nval); 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nvalue != NULL) 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nvalue); 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTypeInitialized = 0; 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL; 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeTypeLibrary: 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lib: the type library structure 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace: the URI bound to the library 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structure associated to the type library 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib, 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * namespace ATTRIBUTE_UNUSED) 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->namespace != NULL) 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) lib->namespace); 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(lib); 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRegisterTypeLibrary: 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace: the URI bound to the library 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the library 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @have: the provide function 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @check: the checking function 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the comparison function 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new type library 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data, 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeHave have, 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCheck check, 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeCompare comp, 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFacetCheck facet, 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeFree freef) 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) || 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (check == NULL) || (comp == NULL)) 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) { 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Relax-NG types library '%s' already registered\n", 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespace); 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGTypeLibraryPtr) 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGTypeLibrary)); 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) { 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(NULL, "adding types library\n"); 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(lib, 0, sizeof(xmlRelaxNGTypeLibrary)); 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->namespace = xmlStrdup(namespace); 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->data = data; 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->have = have; 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->comp = comp; 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->check = check; 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->facet = facet; 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef = freef; 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib); 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Relax-NG types library failed to register '%s'\n", 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespace); 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeTypeLibrary(lib, namespace); 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInitTypes: 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initilize the default type libraries. 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGInitTypes(void) 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGTypeInitialized != 0) 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRegisteredTypes = xmlHashCreate(10); 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGRegisteredTypes == NULL) { 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to allocate sh table for Relax-NG types\n"); 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRegisterTypeLibrary(BAD_CAST 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema-datatypes", 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, xmlRelaxNGSchemaTypeHave, 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaTypeCheck, 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaTypeCompare, 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaFacetCheck, 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSchemaFreeValue); 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs, NULL, 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefaultTypeHave, 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefaultTypeCheck, 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefaultTypeCompare, NULL, 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeInitialized = 1; 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTypes: 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the default Schemas type library associated to RelaxNG 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTypes(void) 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchemaCleanupTypes(); 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGTypeInitialized == 0) 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator) 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeTypeLibrary); 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeInitialized = 0; 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compiling element content into regexp * 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sometime the element content can be compiled into a pure regexp, * 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This allows a faster execution and streamability at that level * 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2858df143a5041f03a22808b59c76698770b74692815Selim Gurun/* from automata.c but not exported */ 2859df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags); 2860df143a5041f03a22808b59c76698770b74692815Selim Gurun 2861df143a5041f03a22808b59c76698770b74692815Selim Gurun 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def); 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsCompileable: 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to check 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable. 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsCompileable(xmlRelaxNGDefinePtr def) 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = -1; 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type != XML_RELAXNG_ELEMENT) && 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->dflags & IS_COMPILABLE)) 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type != XML_RELAXNG_ELEMENT) && 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->dflags & IS_NOT_COMPILABLE)) 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(def->content); 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the element content is compileable 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((def->dflags & IS_NOT_COMPILABLE) == 0) && 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((def->dflags & IS_COMPILABLE) == 0)) { 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(list); 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Because the routine is recursive, we must guard against 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * discovering both COMPILABLE and NOT_COMPILABLE 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags &= ~IS_COMPILABLE; 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_NOT_COMPILABLE; 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE)) 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_COMPILABLE; 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element content for %s is compilable\n", 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element content for %s is not compilable\n", 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Problem in RelaxNGIsCompileable for element %s\n", 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All elements return a compileable status unless they 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are generic like anyName 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->nameClass != NULL) || (def->name == NULL)) 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->depth == -20) { 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->depth = -20; 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(list); 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF:{ 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(list); 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_NOT_COMPILABLE; 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_COMPILABLE; 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RelaxNGIsCompileable %s : true\n", 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RelaxNGIsCompileable %s : false\n", 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Problem in RelaxNGIsCompileable %s\n", 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompile: 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt: the RelaxNG parser context 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition tree to compile 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the set of definitions, it works recursively, till the 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element boundaries, where it tries to compile the content if possible 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (def == NULL)) 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) { 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr oldam = ctxt->am; 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->depth = -25; 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = xmlNewAutomata(); 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->am == NULL) 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3045df143a5041f03a22808b59c76698770b74692815Selim Gurun 3046df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 3047df143a5041f03a22808b59c76698770b74692815Selim Gurun * assume identical strings but not same pointer are different 3048df143a5041f03a22808b59c76698770b74692815Selim Gurun * atoms, needed for non-determinism detection 3049df143a5041f03a22808b59c76698770b74692815Selim Gurun * That way if 2 elements with the same name are in a choice 3050df143a5041f03a22808b59c76698770b74692815Selim Gurun * branch the automata is found non-deterministic and 3051df143a5041f03a22808b59c76698770b74692815Selim Gurun * we fallback to the normal validation which does the right 3052df143a5041f03a22808b59c76698770b74692815Selim Gurun * thing of exploring both choices. 3053df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 3054df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAutomataSetFlags(ctxt->am, 1); 3055df143a5041f03a22808b59c76698770b74692815Selim Gurun 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataGetInitState(ctxt->am); 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataSetFinalState(ctxt->am, ctxt->state); 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->contModel = xmlAutomataCompile(ctxt->am); 3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpIsDeterminist(def->contModel); 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt->am); 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = oldam; 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->am != NULL) && (def->name != NULL)) { 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewTransition2(ctxt->am, 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL, 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, def->ns, 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def); 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr oldam = ctxt->am; 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->depth = -25; 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = xmlNewAutomata(); 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->am == NULL) 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3087df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAutomataSetFlags(ctxt->am, 1); 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataGetInitState(ctxt->am); 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataSetFinalState(ctxt->am, ctxt->state); 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->contModel = xmlAutomataCompile(ctxt->am); 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlRegexpIsDeterminist(def->contModel)) { 3096df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef DEBUG_COMPILE 3097df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 3098df143a5041f03a22808b59c76698770b74692815Selim Gurun "Content model not determinist %s\n", 3099df143a5041f03a22808b59c76698770b74692815Selim Gurun def->name); 3100df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we can only use the automata if it is determinist 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRegexp(def->contModel); 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->contModel = NULL; 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt->am); 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = oldam; 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr oldam = ctxt->am; 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we can't build the content model for this element content 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * but it still might be possible to build it for some of its 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * children, recurse. 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGTryCompile(ctxt, def); 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = oldam; 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, def->content); 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL:{ 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3128df143a5041f03a22808b59c76698770b74692815Selim Gurun list = def->content; 3129df143a5041f03a22808b59c76698770b74692815Selim Gurun while (list != NULL) { 3130df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGCompile(ctxt, list); 3131df143a5041f03a22808b59c76698770b74692815Selim Gurun list = list->next; 3132df143a5041f03a22808b59c76698770b74692815Selim Gurun } 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE:{ 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate; 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE:{ 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate; 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, list); 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr target = NULL; 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, list); 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target == NULL) 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = ctxt->state; 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target); 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = target; 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, list); 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT:{ 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate; 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCompile(ctxt, def->content); 3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewTransition(ctxt->am, ctxt->state, 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, BAD_CAST "#text", 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* This should not happen and generate an internal error */ 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "RNG internal error trying to compile %s\n", 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefName(def)); 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryCompile: 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt: the RelaxNG parser context 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition tree to compile 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the set of definitions, it works recursively, 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possibly ignoring parts which cannot be compiled. 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (def == NULL)) 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type == XML_RELAXNG_START) || 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type == XML_RELAXNG_ELEMENT)) { 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsCompileable(def); 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = NULL; 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompile(ctxt, def); 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->type == XML_RELAXNG_START) 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "compiled the start\n"); 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "compiled element %s\n", def->name); 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->type == XML_RELAXNG_START) 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to compile the start\n"); 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to compile element %s\n", 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name); 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (def->type) { 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGTryCompile(ctxt, def->content); 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = def->content; 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGTryCompile(ctxt, list); 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsing functions * 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node); 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node); 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr nodes, 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int group); 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node); 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node); 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr nodes); 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr node, 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def); 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, xmlNodePtr nodes); 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem); 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content)) 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsNullable: 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable. 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsNullable(xmlRelaxNGDefinePtr define) 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->dflags & IS_NULLABLE) 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->dflags & IS_NOT_NULLABLE) 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsNullable(define->content); 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsNullable(list); 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP:{ 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGIsNullable(list); 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project done: 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->dflags |= IS_NOT_NULLABLE; 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->dflags |= IS_NULLABLE; 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsBlank: 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: a string 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a string is ignorable c.f. 4.2. Whitespace 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsBlank(xmlChar * str) 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*str != 0) { 3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(IS_BLANK_CH(*str))) 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str++; 3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetDataTypeLibrary: 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current data or value element 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies algorithm from 4.3. datatypeLibrary attribute 3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the datatypeLibary value or NULL if not found 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node) 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret, *escape; 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3474df143a5041f03a22808b59c76698770b74692815Selim Gurun if (node == NULL) 3475df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 3476df143a5041f03a22808b59c76698770b74692815Selim Gurun 3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) { 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret[0] == 0) { 3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (escape == NULL) { 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (escape); 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) { 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret[0] == 0) { 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (escape == NULL) { 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (escape); 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseValue: 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the data node. 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG value node. 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL; 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib = NULL; 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *type; 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *library; 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int success = 0; 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_VALUE; 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = xmlGetProp(node, BAD_CAST "type"); 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type != NULL) { 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(type); 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(type, 0)) { 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "value type '%s' is not an NCName\n", type, NULL); 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (library == NULL) 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = type; 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->ns = library; 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(xmlRelaxNGRegisteredTypes, library); 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) { 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Use of unregistered type library '%s'\n", library, 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = NULL; 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = lib; 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->have == NULL) { 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error with type library '%s': no 'have'\n", 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library, NULL); 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project success = lib->have(lib->data, def->name); 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (success != 1) { 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error type '%s' is not exported by type library '%s'\n", 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, library); 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->value = xmlStrdup(BAD_CAST ""); 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((node->children->type != XML_TEXT_NODE) && 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->children->type != XML_CDATA_SECTION_NODE)) || 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->children->next != NULL)) { 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TEXT_EXPECTED, 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting a single text value for <value>content\n", 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def != NULL) { 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->value = xmlNodeGetContent(node); 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->value == NULL) { 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_VALUE_NO_CONTENT, 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element <value> has no content\n", NULL, NULL); 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) { 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *val = NULL; 3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project success = 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->check(lib->data, def->name, def->value, &val, node); 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (success != 1) { 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INVALID_VALUE, 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value '%s' is not acceptable for type '%s'\n", 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->value, def->name); 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->attrs = val; 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseData: 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the data node. 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG data node. 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL, except; 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr param, lastparam = NULL; 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *type; 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *library; 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr content; 3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = xmlGetProp(node, BAD_CAST "type"); 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NULL) { 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL, 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(type); 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(type, 0)) { 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "data type '%s' is not an NCName\n", type, NULL); 3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (library == NULL) 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library = 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(type); 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_DATATYPE; 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = type; 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->ns = library; 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) 3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(xmlRelaxNGRegisteredTypes, library); 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib == NULL) { 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Use of unregistered type library '%s'\n", library, 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = NULL; 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = lib; 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->have == NULL) { 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error with type library '%s': no 'have'\n", 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library, NULL); 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = lib->have(lib->data, def->name); 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 1) { 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error type '%s' is not exported by type library '%s'\n", 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, library); 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (library, 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "http://www.w3.org/2001/XMLSchema-datatypes")) 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && ((xmlStrEqual(def->name, BAD_CAST "IDREF")) 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || (xmlStrEqual(def->name, BAD_CAST "IDREFS")))) { 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->idref = 1; 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = node->children; 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle optional params 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (content != NULL) { 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(content->name, BAD_CAST "param")) 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(library, 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "http://relaxng.org/ns/structure/1.0")) { 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARAM_FORBIDDEN, 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Type library '%s' does not allow type parameters\n", 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project library, NULL); 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((content != NULL) && 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(content->name, BAD_CAST "param"))) 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param = xmlRelaxNGNewDefine(ctxt, node); 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (param != NULL) { 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param->type = XML_RELAXNG_PARAM; 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param->name = xmlGetProp(content, BAD_CAST "name"); 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (param->name == NULL) { 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING, 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "param has no name\n", NULL, NULL); 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project param->value = xmlNodeGetContent(content); 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lastparam == NULL) { 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->attrs = lastparam = param; 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastparam->next = param; 3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastparam = param; 3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib != NULL) { 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle optional except 3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content != NULL) 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(content->name, BAD_CAST "except"))) { 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr tmp2, last = NULL; 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project except = xmlRelaxNGNewDefine(ctxt, node); 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (except == NULL) { 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project except->type = XML_RELAXNG_EXCEPT; 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = content->children; 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = except; 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT, 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "except has no content\n", NULL, NULL); 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlRelaxNGParsePattern(ctxt, child); 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 != NULL) { 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project except->content = last = tmp2; 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp2; 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp2; 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->next; 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check there is no unhandled data 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) { 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, content, XML_RNGP_DATA_CONTENT, 3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element data has unexpected content %s\n", 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content->name, NULL); 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *invalidName = BAD_CAST "\1"; 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareNameClasses: 3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1: the first element/attribute defs 3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2: the second element/attribute defs 3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the restriction on the name 3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the restriction on the namespace 3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element definitions. The comparison is 3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that if both lists do not accept the same QNames, it returns 1 3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1, 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def2) 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode node; 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNs ns; 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxt ctxt; 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt)); 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR; 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def1->type == XML_RELAXNG_ELEMENT) || 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def1->type == XML_RELAXNG_ATTRIBUTE)) { 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->type == XML_RELAXNG_TEXT) 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->name != NULL) { 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = def1->name; 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = invalidName; 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->ns != NULL) { 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->ns[0] == 0) { 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = NULL; 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = &ns; 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.href = def1->ns; 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = NULL; 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGElementMatch(&ctxt, def2, &node)) { 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def1->nameClass != NULL) { 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2); 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def1->type == XML_RELAXNG_TEXT) { 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->type == XML_RELAXNG_TEXT) 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def1->type == XML_RELAXNG_EXCEPT) { 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = 0; 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = 0; 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def2->type == XML_RELAXNG_ELEMENT) || 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def2->type == XML_RELAXNG_ATTRIBUTE)) { 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->name != NULL) { 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = def2->name; 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.name = invalidName; 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = &ns; 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->ns != NULL) { 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->ns[0] == 0) { 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node.ns = NULL; 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.href = def2->ns; 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.href = invalidName; 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGElementMatch(&ctxt, def1, &node)) { 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def2->nameClass != NULL) { 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1); 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = 0; 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareElemDefLists: 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1: the first list of element/attribute defs 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2: the second list of element/attribute defs 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element or attribute definitions. The comparison 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is that if both lists do not accept the same QNames, it returns 1 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ATTRIBUTE_UNUSED, xmlRelaxNGDefinePtr * def1, 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr * def2) 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *basedef2 = def2; 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def1 == NULL) || (def2 == NULL)) 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*def1 == NULL) || (*def2 == NULL)) 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*def1 != NULL) { 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*def2) != NULL) { 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0) 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def2++; 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def2 = basedef2; 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def1++; 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGenerateAttributes: 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the definition definition 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the definition can only generate attributes 3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error. 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt, 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr parent, cur, tmp; 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = NULL; 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def; 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_ELEMENT) || 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_TEXT) || 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_DATATYPE) || 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARAM) || 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_LIST) || 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_VALUE) || 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_EMPTY)) 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_CHOICE) || 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_INTERLEAVE) || 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_GROUP) || 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ONEORMORE) || 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ZEROORMORE) || 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_OPTIONAL) || 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF) || 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_EXTERNALREF) || 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_REF) || 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_DEF)) { 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = cur; 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur; 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->parent = parent; 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetElements: 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the definition definition 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @eora: gather elements (0) or attributes (1) 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the list of top elements a definition can generate 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a list of elements or NULL if none was found. 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr * 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt, 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def, int eora) 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *ret = NULL, parent, cur, tmp; 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0; 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max = 0; 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = NULL; 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def; 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) || 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_TEXT))) || 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) { 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = 10; 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGDefinePtr *) 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr)); 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "getting element list\n"); 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (max <= len) { 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *temp; 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max *= 2; 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = xmlRealloc(ret, 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (max + 1) * sizeof(xmlRelaxNGDefinePtr)); 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "getting element list\n"); 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = temp; 4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret[len++] = cur; 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret[len] = NULL; 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->type == XML_RELAXNG_CHOICE) || 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_INTERLEAVE) || 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_GROUP) || 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ONEORMORE) || 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ZEROORMORE) || 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_OPTIONAL) || 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF) || 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_REF) || 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_DEF) || 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_EXTERNALREF)) { 4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't go within elements or attributes or string values. 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Just gather the element top list 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = cur; 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur; 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->parent = parent; 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == def) 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckChoiceDeterminism: 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the choice definition 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also used to find indeterministic pattern in choice 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt, 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr **list; 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchild = 0, i, j, ret; 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_nullable = 0; 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_indeterminist = 0; 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr triage = NULL; 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_triable = 1; 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE)) 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->dflags & IS_PROCESSED) 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_nullable = xmlRelaxNGIsNullable(def); 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRelaxNGDefinePtr 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *)); 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "building choice\n"); 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a bit strong but safe 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_nullable == 0) { 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project triage = xmlHashCreate(10); 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = 0; 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = xmlRelaxNGGetElements(ctxt, cur, 0); 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((list[i] == NULL) || (list[i][0] == NULL)) { 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = 0; 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (is_triable == 1) { 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr *tmp; 4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = list[i]; 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*tmp != NULL) && (is_triable == 1)) { 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*tmp)->type == XML_RELAXNG_TEXT) { 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#text", NULL, 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*tmp)->name != NULL)) { 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, NULL, 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, (*tmp)->ns, 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", NULL, 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(triage, 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", (*tmp)->ns, 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) cur); 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_triable = -1; 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp++; 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] == NULL) 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < i; j++) { 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[j] == NULL) 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_indeterminist = 1; 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] != NULL) 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list[i]); 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_indeterminist) { 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_INDETERMINIST; 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_triable == 1) { 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_TRIABLE; 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = triage; 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (triage != NULL) { 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(triage, NULL); 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_PROCESSED; 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckGroupAttrs: 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the group definition 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Detects violations of rule 7.3 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt, 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr **list; 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchild = 0, i, j, ret; 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def == NULL) || 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((def->type != XML_RELAXNG_GROUP) && 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type != XML_RELAXNG_ELEMENT))) 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->dflags & IS_PROCESSED) 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->attrs; 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRelaxNGDefinePtr 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *)); 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "building group\n"); 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->attrs; 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] == NULL) 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < i; j++) { 4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[j] == NULL) 4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT, 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attributes conflicts in group\n", NULL, NULL); 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbchild; i++) { 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[i] != NULL) 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list[i]); 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_PROCESSED; 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGComputeInterleaves: 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the interleave definition 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the definition name 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A lot of work for preprocessing interleave definitions 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is potentially needed to get a decent execution speed at runtime 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - trying to get a total order on the element nodes generated 4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the interleaves, order the list of interleave definitions 4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * following that order. 4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - if <text/> is used to handle mixed content, it is better to 4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flag this in the define and simplify the runtime checking 4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * algorithm 4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def, 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ctxt, 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar * name ATTRIBUTE_UNUSED) 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, *tmp; 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPartitionPtr partitions = NULL; 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr *groups = NULL; 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr group; 4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, ret, res; 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbgroups = 0; 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchild = 0; 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_mixed = 0; 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_determinist = 1; 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't run that check in case of error. Infinite recursion 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * becomes possible. 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors != 0) 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGComputeInterleaves(%s)\n", name); 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchild++; 4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " %d child\n", nbchild); 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups = (xmlRelaxNGInterleaveGroupPtr *) 4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr)); 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups == NULL) 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = def->content; 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr) 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup)); 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[nbgroups] == NULL) 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_RELAXNG_TEXT) 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_mixed++; 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups]->rule = cur; 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0); 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1); 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbgroups++; 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " %d groups\n", nbgroups); 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Let's check that all rules makes a partitions according to 7.4 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions = (xmlRelaxNGPartitionPtr) 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlRelaxNGPartition)); 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions == NULL) 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(partitions, 0, sizeof(xmlRelaxNGPartition)); 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->nbgroups = nbgroups; 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->triage = xmlHashCreate(nbgroups); 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) { 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = groups[i]; 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = i + 1; j < nbgroups; j++) { 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[j] == NULL) 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs, 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[j]->defs); 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT, 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element or text conflicts in interleave\n", 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs, 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project groups[j]->attrs); 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT, 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attributes conflicts in interleave\n", NULL, 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = group->defs; 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && (*tmp != NULL)) { 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*tmp != NULL) { 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*tmp)->type == XML_RELAXNG_TEXT) { 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#text", NULL, 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*tmp)->name != NULL)) { 4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, NULL, 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*tmp)->name, (*tmp)->ns, 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", NULL, 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlHashAddEntry2(partitions->triage, 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", (*tmp)->ns, 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) (long) (i + 1)); 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*tmp)->nameClass != NULL) 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = 2; 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = -1; 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp++; 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_determinist = 0; 4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->groups = groups; 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and save the partition list back in the def 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->data = partitions; 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_mixed != 0) 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->dflags |= IS_MIXED; 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_determinist == 1) 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->flags = IS_DETERMINIST; 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_determinist == 2) 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->flags = IS_DETERMINIST | IS_NEEDCHECK; 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error: 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "in interleave computation\n"); 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups != NULL) { 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[i] != NULL) { 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (groups[i]->defs != NULL) 4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(groups[i]->defs); 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(groups[i]); 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(groups); 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreePartition(partitions); 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInterleave: 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the data node. 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG interleave node. 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error 4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL; 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr last = NULL, cur; 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_INTERLEAVE; 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->interleaves = xmlHashCreate(10); 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) { 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(ctxt, "create interleaves\n"); 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char name[32]; 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++); 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) { 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_ADD, 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to add %s to hash table\n", 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) name, NULL); 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT, 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element interleave is empty\n", NULL, NULL); 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(child, "element")) { 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseElement(ctxt, child); 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, child); 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = def; 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = last = cur; 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInclude: 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the include node 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Integrate the content of an include node in the current grammar 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr incl; 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, tmp; 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project incl = node->psvi; 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl == NULL) { 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INCLUDE_EMPTY, 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Include node has no data\n", NULL, NULL); 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(incl->doc); 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n", 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(root->name, BAD_CAST "grammar")) { 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Include document root is not a grammar\n", NULL, NULL); 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merge the definition from both the include and the internal list 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root->children != NULL) { 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children); 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children); 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDefine: 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the define node 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG define element node. 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, tmp; 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *olddefine; 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlGetProp(node, BAD_CAST "name"); 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING, 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "define has no name\n", NULL, NULL); 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(name); 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(name, 0)) { 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME, 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "define name '%s' is not an NCName\n", name, NULL); 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_DEF; 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = name; 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_EMPTY, 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "define has no children\n", NULL, NULL); 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project olddefine = ctxt->define; 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = name; 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = olddefine; 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->defs == NULL) 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->defs = xmlHashCreate(10); 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->defs == NULL) { 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not create definition hash\n", NULL, NULL); 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def); 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) { 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev; 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlHashLookup(ctxt->grammar->defs, name); 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL) { 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error on define aggregation of %s\n", 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev->nextHash != NULL) 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->nextHash; 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->nextHash = def; 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4653df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRef: 4654df143a5041f03a22808b59c76698770b74692815Selim Gurun * @payload: the parser context 4655df143a5041f03a22808b59c76698770b74692815Selim Gurun * @data: the current grammar 4656df143a5041f03a22808b59c76698770b74692815Selim Gurun * @name: the reference name 4657df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4658df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import import one references into the current grammar 4659df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4660df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 4661df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRef(void *payload, void *data, xmlChar *name) { 4662df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr) data; 4663df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload; 4664df143a5041f03a22808b59c76698770b74692815Selim Gurun int tmp; 4665df143a5041f03a22808b59c76698770b74692815Selim Gurun 4666df143a5041f03a22808b59c76698770b74692815Selim Gurun def->dflags |= IS_EXTERNAL_REF; 4667df143a5041f03a22808b59c76698770b74692815Selim Gurun 4668df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp = xmlHashAddEntry(ctxt->grammar->refs, name, def); 4669df143a5041f03a22808b59c76698770b74692815Selim Gurun if (tmp < 0) { 4670df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGDefinePtr prev; 4671df143a5041f03a22808b59c76698770b74692815Selim Gurun 4672df143a5041f03a22808b59c76698770b74692815Selim Gurun prev = (xmlRelaxNGDefinePtr) 4673df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlHashLookup(ctxt->grammar->refs, def->name); 4674df143a5041f03a22808b59c76698770b74692815Selim Gurun if (prev == NULL) { 4675df143a5041f03a22808b59c76698770b74692815Selim Gurun if (def->name != NULL) { 4676df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 4677df143a5041f03a22808b59c76698770b74692815Selim Gurun "Error refs definitions '%s'\n", 4678df143a5041f03a22808b59c76698770b74692815Selim Gurun def->name, NULL); 4679df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 4680df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 4681df143a5041f03a22808b59c76698770b74692815Selim Gurun "Error refs definitions\n", 4682df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL, NULL); 4683df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4684df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 4685df143a5041f03a22808b59c76698770b74692815Selim Gurun def->nextHash = prev->nextHash; 4686df143a5041f03a22808b59c76698770b74692815Selim Gurun prev->nextHash = def; 4687df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4688df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4689df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4690df143a5041f03a22808b59c76698770b74692815Selim Gurun 4691df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4692df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRefs: 4693df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: the parser context 4694df143a5041f03a22808b59c76698770b74692815Selim Gurun * @grammar: the sub grammar 4695df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4696df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import references from the subgrammar into the current grammar 4697df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4698df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of success, -1 in case of failure 4699df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4700df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 4701df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRefs(xmlRelaxNGParserCtxtPtr ctxt, 4702df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGGrammarPtr grammar) { 4703df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt == NULL) || (grammar == NULL) || (ctxt->grammar == NULL)) 4704df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 4705df143a5041f03a22808b59c76698770b74692815Selim Gurun if (grammar->refs == NULL) 4706df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 4707df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->grammar->refs == NULL) 4708df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->grammar->refs = xmlHashCreate(10); 4709df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->grammar->refs == NULL) { 4710df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED, 4711df143a5041f03a22808b59c76698770b74692815Selim Gurun "Could not create references hash\n", NULL, NULL); 4712df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 4713df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4714df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlHashScan(grammar->refs, xmlRelaxNGParseImportRef, ctxt); 4715df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 4716df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4717df143a5041f03a22808b59c76698770b74692815Selim Gurun 4718df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGProcessExternalRef: 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the externlRef node 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process and compile an externlRef node 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDefinePtr or NULL in case of error 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr docu; 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root, tmp; 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns; 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newNs = 0, oldflags; 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu = node->psvi; 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu != NULL) { 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_EXTERNALREF; 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu->content == NULL) { 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then do the parsing for good 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(docu->doc); 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXTERNALREF_EMTPY, 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: %s is empty\n", ctxt->URL, 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ns transmission rules 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(root, BAD_CAST "ns"); 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = node; 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) { 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(tmp, BAD_CAST "ns"); 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(root, BAD_CAST "ns", ns); 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newNs = 1; 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsing to get a precompiled schemas. 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF; 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu->schema = xmlRelaxNGParseDocument(ctxt, root); 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((docu->schema != NULL) && 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (docu->schema->topgrammar != NULL)) { 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu->content = docu->schema->topgrammar->start; 4786df143a5041f03a22808b59c76698770b74692815Selim Gurun if (docu->schema->topgrammar->refs) 4787df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGParseImportRefs(ctxt, docu->schema->topgrammar); 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the externalRef may be reused in a different ns context 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newNs == 1) { 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnsetProp(root, BAD_CAST "ns"); 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = docu->content; 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePattern: 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the pattern node. 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG pattern node. 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error or if no 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pattern is generated. 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL; 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(node, "element")) { 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseElement(ctxt, node); 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "attribute")) { 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseAttribute(ctxt, node); 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "empty")) { 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_EMPTY; 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_NOT_EMPTY, 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "empty: had a child node\n", NULL, NULL); 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "text")) { 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_TEXT; 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_TEXT_HAS_CHILD, 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "text: had a child node\n", NULL, NULL); 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "zeroOrMore")) { 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_ZEROORMORE; 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 1); 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "oneOrMore")) { 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_ONEORMORE; 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 1); 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "optional")) { 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_OPTIONAL; 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 1); 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "choice")) { 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_CHOICE; 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "group")) { 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_GROUP; 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "ref")) { 4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_REF; 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = xmlGetProp(node, BAD_CAST "name"); 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->name == NULL) { 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n", 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(def->name); 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(def->name, 0)) { 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_NAME_INVALID, 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ref name '%s' is not an NCName\n", def->name, 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n", 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->refs == NULL) 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->refs = xmlHashCreate(10); 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->refs == NULL) { 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not create references hash\n", NULL, NULL); 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def); 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) { 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev; 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = (xmlRelaxNGDefinePtr) 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(ctxt->grammar->refs, def->name); 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL) { 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->name != NULL) { 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error refs definitions '%s'\n", 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, NULL); 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Error refs definitions\n", 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->nextHash = prev->nextHash; 4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->nextHash = def; 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "data")) { 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseData(ctxt, node); 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "value")) { 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseValue(ctxt, node); 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "list")) { 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_LIST; 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is empty\n", node->name, NULL); 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParsePatterns(ctxt, node->children, 0); 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "interleave")) { 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseInterleave(ctxt, node); 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "externalRef")) { 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGProcessExternalRef(ctxt, node); 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "notAllowed")) { 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_NOT_ALLOWED; 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY, 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: notAllowed element is not empty\n", 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "grammar")) { 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar, old; 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr oldparent; 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found <grammar> pattern\n"); 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldparent = ctxt->parentgrammar; 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old = ctxt->grammar; 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->parentgrammar = old; 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = xmlRelaxNGParseGrammar(ctxt, node->children); 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (old != NULL) { 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = old; 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->parentgrammar = oldparent; 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar != NULL) { 5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar->next = old->next; 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old->next = grammar; 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar != NULL) 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = grammar->start; 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "parentRef")) { 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->parentgrammar == NULL) { 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT, 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Use of parentRef without a parent grammar\n", NULL, 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, node); 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_PARENTREF; 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name = xmlGetProp(node, BAD_CAST "name"); 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->name == NULL) { 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_NAME, 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "parentRef has no name\n", NULL, NULL); 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(def->name); 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(def->name, 0)) { 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID, 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "parentRef name '%s' is not an NCName\n", 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, NULL); 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY, 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "parentRef is not empty\n", NULL, NULL); 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->parentgrammar->refs == NULL) 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->parentgrammar->refs = xmlHashCreate(10); 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->parentgrammar->refs == NULL) { 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not create references hash\n", NULL, NULL); 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (def->name != NULL) { 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def); 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) { 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev; 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = (xmlRelaxNGDefinePtr) 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup(ctxt->parentgrammar->refs, def->name); 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL) { 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error parentRef definitions '%s'\n", 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->name, NULL); 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->nextHash = prev->nextHash; 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->nextHash = def; 5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "mixed")) { 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n", 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParseInterleave(ctxt, node); 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def != NULL) { 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr tmp; 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->content != NULL) && (def->content->next != NULL)) { 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGNewDefine(ctxt, node); 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->type = XML_RELAXNG_GROUP; 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->content = def->content; 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = tmp; 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGNewDefine(ctxt, node); 5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->type = XML_RELAXNG_TEXT; 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = def->content; 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = tmp; 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_CONSTRUCT, 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected node %s is not a pattern\n", node->name, 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = NULL; 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseAttribute: 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG attribute node. 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, cur; 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old_flags; 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ATTRIBUTE; 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->def; 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_EMPTY, 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseattribute: attribute has no children\n", 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old_flags = ctxt->flags; 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE; 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseNameClass(ctxt, child, ret); 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child != NULL) { 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, child); 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = cur; 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = ret; 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CONTENT, 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "attribute has invalid content\n", NULL, 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_NOOP, 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, noop found in attribute\n", 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child != NULL) { 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN, 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "attribute has multiple children\n", NULL, NULL); 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = old_flags; 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseExceptNameClass: 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the except node 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: 1 if within an attribute, 0 if within an element 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node. 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt, 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, int attr) 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, cur, last = NULL; 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_RELAXNG(node, "except")) { 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MISSING, 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting an except node\n", NULL, NULL); 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->next != NULL) { 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MULTIPLE, 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "exceptNameClass allows only a single except node\n", 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n", 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_EXCEPT; 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGNewDefine(ctxt, child); 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr) 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_ATTRIBUTE; 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_ELEMENT; 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) { 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = cur; 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseNameClass: 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the nameClass node 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the current definition 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node. 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def) 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, tmp; 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *val; 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = def; 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) || 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_RELAXNG(node, "nsName"))) { 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((def->type != XML_RELAXNG_ELEMENT) && 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type != XML_RELAXNG_ATTRIBUTE)) { 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = def; 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ATTRIBUTE; 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ELEMENT; 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(node, "name")) { 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlNodeGetContent(node); 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNormExtSpace(val); 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateNCName(val, 0)) { 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->parent != NULL) 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s name '%s' is not an NCName\n", 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name, val); 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "name '%s' is not an NCName\n", 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val, NULL); 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = val; 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlGetProp(node, BAD_CAST "ns"); 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns = val; 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val != NULL) && 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) { 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute with namespace '%s' is not allowed\n", 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val, NULL); 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val != NULL) && 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) { 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_XMLNS_NAME, 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute with QName 'xmlns' is not allowed\n", 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val, NULL); 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "anyName")) { 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = NULL; 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns = NULL; 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nameClass = 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseExceptNameClass(ctxt, node->children, 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type == 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ATTRIBUTE)); 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "nsName")) { 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = NULL; 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns = xmlGetProp(node, BAD_CAST "ns"); 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->ns == NULL) { 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_NSNAME_NO_NS, 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "nsName has no ns attribute\n", NULL, NULL); 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->ns != NULL) && 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) { 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute with namespace '%s' is not allowed\n", 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ns, NULL); 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children != NULL) { 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nameClass = 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseExceptNameClass(ctxt, node->children, 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def->type == 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ATTRIBUTE)); 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(node, "choice")) { 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr last = NULL; 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = def; 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_CHOICE; 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->children == NULL) { 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY, 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element choice is empty\n", NULL, NULL); 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseNameClass(ctxt, child, ret); 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = ret->nameClass = tmp; 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp; 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp; 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_CONTENT, 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "expecting name, anyName, nsName or choice : got %s\n", 5372df143a5041f03a22808b59c76698770b74692815Selim Gurun (node == NULL ? (const xmlChar *) "nothing" : node->name), 5373df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL); 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != def) { 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def->nameClass == NULL) { 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->nameClass = ret; 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = def->nameClass; 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp->next != NULL) { 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = ret; 5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseElement: 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG element node. 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr ret, cur, last; 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *olddefine; 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewDefine(ctxt, node); 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_RELAXNG_ELEMENT; 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->def; 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node->children; 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_EMPTY, 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseElement: element has no children\n", 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseNameClass(ctxt, child, ret); 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child == NULL) { 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT, 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseElement: element has no content\n", 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project olddefine = ctxt->define; 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = NULL; 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, child); 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = ret; 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = last = cur; 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((last->type == XML_RELAXNG_ELEMENT) && 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->content == last)) { 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = xmlRelaxNGNewDefine(ctxt, node); 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->content != NULL) { 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content->type = XML_RELAXNG_GROUP; 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content->content = last; 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = last; 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = ret->attrs; 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attrs = cur; 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, start found in element\n", 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, param found in element\n", 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, except found in element\n", 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "RNG Internal error, noop found in element\n", 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = olddefine; 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePatterns: 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: list of nodes 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @group: use an implicit <group> for elements 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node. 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error. 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes, 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int group) 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent; 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = ctxt->def; 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (nodes != NULL) { 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(nodes, "element")) { 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParseElement(ctxt, nodes); 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = last = cur; 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) && 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (def == last)) { 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, nodes); 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_GROUP; 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = last; 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGParsePattern(ctxt, nodes); 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) { 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = last = cur; 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = cur; 5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = cur; 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes = nodes->next; 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (def); 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseStart: 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: start children nodes 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node. 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def = NULL, last; 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes == NULL) { 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n", 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(nodes, "empty")) { 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, nodes); 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_EMPTY; 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes->children != NULL) { 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_EMPTY_CONTENT, 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element empty is not empty\n", NULL, NULL); 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(nodes, "notAllowed")) { 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, nodes); 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def == NULL) 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_NOT_ALLOWED; 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes->children != NULL) { 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY, 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element notAllowed is not empty\n", NULL, NULL); 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGParsePatterns(ctxt, nodes, 1); 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar->start != NULL) { 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = ctxt->grammar->start; 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (last->next != NULL) 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = last->next; 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = def; 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->start = def; 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes = nodes->next; 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes != NULL) { 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_START_CONTENT, 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "start more than one children\n", NULL, NULL); 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammarContent: 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG grammar node. 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr nodes) 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, tmp; 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes == NULL) { 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_EMPTY, 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "grammar has no children\n", NULL, NULL); 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (nodes != NULL) { 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(nodes, "start")) { 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodes->children == NULL) { 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "start has no children\n", NULL, NULL); 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseStart(ctxt, nodes->children); 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(nodes, "define")) { 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseDefine(ctxt, nodes); 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_RELAXNG(nodes, "include")) { 5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGParseInclude(ctxt, nodes); 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "grammar has unexpected child %s\n", nodes->name, 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes = nodes->next; 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckReference: 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ref: the ref 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name associated to the defines 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name. 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckReference(xmlRelaxNGDefinePtr ref, 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ctxt, 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * name) 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def, cur; 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5675df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 5676df143a5041f03a22808b59c76698770b74692815Selim Gurun * Those rules don't apply to imported ref from xmlRelaxNGParseImportRef 5677df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 5678df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ref->dflags & IS_EXTERNAL_REF) 5679df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 5680df143a5041f03a22808b59c76698770b74692815Selim Gurun 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = ctxt->grammar; 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) { 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error: no grammar in CheckReference %s\n", 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref->content != NULL) { 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error: reference has content in CheckReference %s\n", 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->defs != NULL) { 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlHashLookup(grammar->defs, name); 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def != NULL) { 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ref; 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = def; 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->nextHash; 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Reference %s has no matching definition\n", name, 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Reference %s has no matching definition\n", name, 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCombine: 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the define(s) list 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name associated to the defines 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name. 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCombine(xmlRelaxNGDefinePtr define, 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name) 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *combine; 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int choiceOrInterleave = -1; 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int missing = 0; 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, last, tmp, tmp2; 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->nextHash == NULL) 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = define; 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine = xmlGetProp(cur->node, BAD_CAST "combine"); 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (combine != NULL) { 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(combine, BAD_CAST "choice")) { 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 1; 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 0) { 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Defines for %s use both 'choice' and 'interleave'\n", 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 1) { 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Defines for %s use both 'choice' and 'interleave'\n", 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE, 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Defines for %s use unknown combine value '%s''\n", 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, combine); 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(combine); 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (missing == 0) 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project missing = 1; 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE, 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Some defines for %s needs the combine attribute\n", 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->nextHash; 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGCheckCombine(): merging %s defines: %d\n", 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, choiceOrInterleave); 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGNewDefine(ctxt, define->node); 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_INTERLEAVE; 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_CHOICE; 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = define; 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->content != NULL) { 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->content->next != NULL) { 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we need first to create a wrapper. 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node); 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2->type = XML_RELAXNG_GROUP; 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2->content = tmp->content; 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = tmp->content; 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last == NULL) { 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = tmp2; 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp2; 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp2; 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->content = cur; 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->nextHash; 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->content = cur; 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) { 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->interleaves = xmlHashCreate(10); 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) { 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to create interleaves hash table\n", NULL, 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char tmpname[32]; 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0) { 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to add %s to hash table\n", 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) tmpname, NULL); 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 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 * xmlRelaxNGCombineStart: 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar: the grammar 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine rule for all the start 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar. 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt, 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar) 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr starts; 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *combine; 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int choiceOrInterleave = -1; 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int missing = 0; 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project starts = grammar->start; 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((starts == NULL) || (starts->next == NULL)) 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = starts; 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->node == NULL) || (cur->node->parent == NULL) || 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) { 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine = NULL; 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING, 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error: start element not found\n", NULL, 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine = xmlGetProp(cur->node->parent, BAD_CAST "combine"); 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (combine != NULL) { 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(combine, BAD_CAST "choice")) { 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 1; 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 0) { 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "<start> use both 'choice' and 'interleave'\n", 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (choiceOrInterleave == 1) { 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "<start> use both 'choice' and 'interleave'\n", 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE, 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "<start> uses unknown combine value '%s''\n", 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project combine, NULL); 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(combine); 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (missing == 0) 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project missing = 1; 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_NEED_COMBINE, 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Some <start> element miss the combine attribute\n", 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGCombineStart(): merging <start>: %d\n", 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave); 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == -1) 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project choiceOrInterleave = 0; 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGNewDefine(ctxt, starts->node); 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_INTERLEAVE; 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_CHOICE; 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = grammar->start; 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar->start = cur; 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (choiceOrInterleave == 0) { 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->interleaves = xmlHashCreate(10); 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves == NULL) { 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to create interleaves hash table\n", NULL, 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char tmpname[32]; 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0) { 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to add %s to hash table\n", 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) tmpname, NULL); 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 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 * xmlRelaxNGCheckCycles: 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the counter 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for cycles. 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if check passed, and -1 in case of error 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt, 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, int depth) 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ret == 0) && (cur != NULL)) { 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_REF) || 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF)) { 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->depth == -1) { 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = depth; 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = -2; 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (depth == cur->depth) { 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_CYCLE, 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Detected a cycle in %s references\n", 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_ELEMENT) { 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1); 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryUnlink: 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the definition to unlink 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: the parent definition 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prev: the previous sibling definition 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to unlink a definition. If not possble make it a NOOP 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new prev definition 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev) 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != NULL) { 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = cur->next; 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (parent != NULL) { 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (parent->content == cur) 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->content = cur->next; 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (parent->attrs == cur) 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->attrs = cur->next; 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (parent->nameClass == cur) 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->nameClass = cur->next; 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_NOOP; 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (prev); 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSimplify: 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for simplification of empty and notAllowed 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt, 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent) 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr prev = NULL; 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_REF) || 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF)) { 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->depth != -3) { 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = -3; 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->content, cur); 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ATTRIBUTE) || 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_LIST) || 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_GROUP) || 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE) || 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ONEORMORE) || 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_NOT_ALLOWED; 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) { 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EMPTY) { 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ONEORMORE) || 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_EMPTY; 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_GROUP) || 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE))) { 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent = parent; 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->content, cur); 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL)) 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->attrs, cur); 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nameClass != NULL) 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, cur->nameClass, cur); 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * On Elements, try to move attribute only generating rules on 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the attrs rules. 6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_RELAXNG_ELEMENT) { 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int attronly; 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr tmp, pre; 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->content != NULL) { 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attronly = 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGenerateAttributes(ctxt, cur->content); 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attronly == 1) { 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * migrate cur->content to attrs 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->content; 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = tmp->next; 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = cur->attrs; 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->attrs = tmp; 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * cur->content can generate elements or text 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pre = cur->content; 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((pre != NULL) && (pre->next != NULL)) { 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = pre->next; 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp); 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attronly == 1) { 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * migrate tmp to attrs 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pre->next = tmp->next; 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = cur->attrs; 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->attrs = tmp; 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pre = tmp; 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This may result in a simplification 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_GROUP) || 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_INTERLEAVE)) { 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content == NULL) 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_EMPTY; 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (cur->content->next == NULL) { 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent == NULL) && (prev == NULL)) { 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_RELAXNG_NOOP; 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (prev == NULL) { 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->content = cur->content; 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content->next = cur->next; 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content->next = cur->next; 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = cur->content; 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->content; 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the current node may have been transformed back 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_EXCEPT) && 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->content != NULL) && 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) { 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ATTRIBUTE) || 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_LIST) || 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_GROUP) || 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE) || 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ONEORMORE) || 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_NOT_ALLOWED; 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_CHOICE)) { 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EMPTY) { 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_ONEORMORE) || 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_ZEROORMORE))) { 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->type = XML_RELAXNG_EMPTY; 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((parent != NULL) && 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((parent->type == XML_RELAXNG_GROUP) || 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_INTERLEAVE) || 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (parent->type == XML_RELAXNG_CHOICE))) { 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = cur; 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGroupContentType: 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1: the first content type 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2: the second content type 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to group 2 content types 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1, 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGContentType ct2) 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_ERROR)) 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_ERROR); 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ct1 == XML_RELAXNG_CONTENT_EMPTY) 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ct2); 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ct2 == XML_RELAXNG_CONTENT_EMPTY) 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ct1); 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) && 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_COMPLEX); 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_ERROR); 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGMaxContentType: 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1: the first content type 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2: the second content type 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the max content-type 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1, 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGContentType ct2) 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_ERROR)) 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_ERROR); 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) || 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_SIMPLE)) 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_SIMPLE); 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) || 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_COMPLEX); 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_RELAXNG_CONTENT_EMPTY); 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckRules: 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current definition 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: some accumulated flags 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ptype: the parent type 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for rules in section 7.1 and 7.2 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type of @cur 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur, int flags, 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGType ptype) 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6245df143a5041f03a22808b59c76698770b74692815Selim Gurun int nflags; 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY; 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_EMPTY; 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_RELAXNG_REF) || 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_PARENTREF)) { 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This should actually be caught by list//element(ref) at the 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element boundaries, c.f. Bug #159968 local refs are dropped 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in step 4.19. 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_REF, 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//ref\n", NULL, 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF, 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//ref\n", 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6269df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->content == NULL) { 6270df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_RELAXNG_PARENTREF) 6271df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF, 6272df143a5041f03a22808b59c76698770b74692815Selim Gurun "Internal found no define for parent refs\n", 6273df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL, NULL); 6274df143a5041f03a22808b59c76698770b74692815Selim Gurun else 6275df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF, 6276df143a5041f03a22808b59c76698770b74692815Selim Gurun "Internal found no define for ref %s\n", 6277df143a5041f03a22808b59c76698770b74692815Selim Gurun (cur->name ? cur->name: BAD_CAST "null"), NULL); 6278df143a5041f03a22808b59c76698770b74692815Selim Gurun } 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->depth > -4) { 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = -4; 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGCheckRules(ctxt, cur->content, 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags, cur->type); 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->depth = ret - 15; 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->depth == -4) { 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_COMPLEX; 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGContentType) (cur->depth + 15); 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_ELEMENT) { 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The 7.3 Attribute derivation rule for groups is plugged there 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckGroupAttrs(ctxt, cur); 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM, 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//element(ref)\n", 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM, 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//element(ref)\n", 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern attribute//element(ref)\n", 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern attribute//element(ref)\n", 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reset since in the simple form elements are only child 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of grammar/define 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = 0; 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type); 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != XML_RELAXNG_CONTENT_EMPTY) { 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY, 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s attributes have a content type error\n", 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == XML_RELAXNG_CONTENT_ERROR) { 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR, 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has a content type error\n", 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_COMPLEX; 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_ATTRIBUTE) { 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ATTRIBUTE) { 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR, 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern attribute//attribute\n", 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR, 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//attribute\n", 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_OOMGROUP) { 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR, 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern oneOrMore//group//attribute\n", 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) { 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern oneOrMore//interleave//attribute\n", 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR, 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//attribute\n", 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR, 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//attribute\n", 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!(flags & XML_RELAXNG_IN_ONEORMORE)) 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (cur->name == NULL)) { 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns == NULL) { 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR, 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found anyName attribute without oneOrMore ancestor\n", 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR, 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found nsName attribute without oneOrMore ancestor\n", 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_ATTRIBUTE; 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type); 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_EMPTY; 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->type == XML_RELAXNG_ONEORMORE) || 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ZEROORMORE)) { 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//oneOrMore\n", 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE, 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//oneOrMore\n", 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_ONEORMORE; 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGGroupContentType(ret, ret); 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_LIST) { 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST, 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//list\n", NULL, 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST, 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//list\n", 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST, 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//list\n", NULL, 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_LIST; 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_GROUP) { 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP, 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//group\n", 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP, 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//group\n", NULL, 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ONEORMORE) 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_OOMGROUP; 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags; 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The 7.3 Attribute derivation rule for groups is plugged there 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckGroupAttrs(ctxt, cur); 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_INTERLEAVE) { 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE, 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//interleave\n", 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//interleave\n", 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//interleave\n", 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_ONEORMORE) 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE; 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags; 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EXCEPT) { 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent != NULL) && 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->type == XML_RELAXNG_DATATYPE)) 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags | XML_RELAXNG_IN_DATAEXCEPT; 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nflags = flags; 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, nflags, 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type); 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_DATATYPE) { 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA, 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//data\n", NULL, 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_SIMPLE; 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_VALUE) { 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE, 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//value\n", NULL, 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_SIMPLE; 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_TEXT) { 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_LIST) { 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT, 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern list//text\n", NULL, 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT, 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//text\n", 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT, 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//text\n", NULL, 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_COMPLEX; 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_EMPTY) { 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_DATAEXCEPT) { 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY, 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern data/except//empty\n", 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_RELAXNG_IN_START) { 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY, 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found forbidden pattern start//empty\n", NULL, 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = XML_RELAXNG_CONTENT_EMPTY; 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_RELAXNG_CHOICE) { 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckChoiceDeterminism(ctxt, cur); 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ptype == XML_RELAXNG_GROUP) { 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlRelaxNGGroupContentType(val, ret); 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_INTERLEAVE) { 6530df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 6531df143a5041f03a22808b59c76698770b74692815Selim Gurun * TODO: scan complain that tmp is never used, seems on purpose 6532df143a5041f03a22808b59c76698770b74692815Selim Gurun * need double-checking 6533df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGGroupContentType(val, ret); 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != XML_RELAXNG_CONTENT_ERROR) 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGMaxContentType(val, ret); 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_CHOICE) { 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlRelaxNGMaxContentType(val, ret); 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_LIST) { 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = XML_RELAXNG_CONTENT_SIMPLE; 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ptype == XML_RELAXNG_EXCEPT) { 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == XML_RELAXNG_CONTENT_ERROR) 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = XML_RELAXNG_CONTENT_ERROR; 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = XML_RELAXNG_CONTENT_SIMPLE; 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlRelaxNGGroupContentType(val, ret); 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (val); 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammar: 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: grammar children nodes 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG <grammar> node 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal xmlRelaxNGGrammarPtr built or 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr ret, tmp, old; 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n"); 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGNewGrammar(ctxt); 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link the new grammar in the tree 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->grammar; 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar != NULL) { 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->grammar->children; 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->children = ret; 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp->next != NULL) 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = ret; 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old = ctxt->grammar; 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = ret; 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseGrammarContent(ctxt, nodes); 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = ret; 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar == NULL) { 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to parse <grammar> content\n", NULL, NULL); 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->grammar->start == NULL) { 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START, 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element <grammar> has no <start>\n", NULL, NULL); 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Apply 4.17 mergingd rules to defines and starts 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCombineStart(ctxt, ret); 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->defs != NULL) { 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine, 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * link together defines and refs in this grammar 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->refs != NULL) { 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference, 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6621df143a5041f03a22808b59c76698770b74692815Selim Gurun 662260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* @@@@ */ 662360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = old; 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDocument: 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the root node of the RelaxNG schema 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG definition resource and build an internal 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNG struture which can be used to validate instances. 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built or 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema = NULL; 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *olddefine; 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr old; 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (node == NULL)) 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = xmlRelaxNGNewRelaxNG(ctxt); 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project olddefine = ctxt->define; 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = NULL; 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_RELAXNG(node, "grammar")) { 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children); 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr tmp, ret; 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt); 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar == NULL) { 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (schema); 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link the new grammar in the tree 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = ctxt->grammar; 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->grammar != NULL) { 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->grammar->children; 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar->children = ret; 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp->next != NULL) 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = ret; 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project old = ctxt->grammar; 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = ret; 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParseStart(ctxt, node); 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (old != NULL) 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->grammar = old; 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->define = olddefine; 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar->start != NULL) { 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0); 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) { 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL); 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((schema->topgrammar->start != NULL) && 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (schema->topgrammar->start->type == XML_RELAXNG_NOOP) && 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (schema->topgrammar->start->next != NULL)) 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar->start = 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->topgrammar->start->content; 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start, 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_IN_START, XML_RELAXNG_NOOP); 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParseDocument() failed\n"); 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (schema); 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reading RelaxNGs * 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewParserCtxt: 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the location of the schema 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that file/resource expected 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file. 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewParserCtxt(const char *URL) 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ret; 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(NULL, "building parser\n"); 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->URL = xmlStrdup((const xmlChar *) URL); 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = xmlGenericError; 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewMemParserCtxt: 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: a pointer to a char array containing the schemas 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the array 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that memory buffer expected 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file. 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewMemParserCtxt(const char *buffer, int size) 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ret; 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buffer == NULL) || (size <= 0)) 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(NULL, "building parser\n"); 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->buffer = buffer; 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->size = size; 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = xmlGenericError; 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDocParserCtxt: 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a preparsed document tree 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parser context for that document. 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: since the process of compiling a RelaxNG schemas modifies the 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document, the @doc parameter is duplicated internally. 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDocParserCtxt(xmlDocPtr doc) 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGParserCtxtPtr ret; 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr copy; 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy = xmlCopyDoc(doc, 1); 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (copy == NULL) 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErrMemory(NULL, "building parser\n"); 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->document = copy; 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->freedoc = 1; 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeParserCtxt: 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt) 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->URL != NULL) 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->URL); 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->doc != NULL) 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocument(ctxt->doc); 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves != NULL) 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->interleaves, NULL); 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->documents != NULL) 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDocumentList(ctxt->documents); 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->includes != NULL) 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeIncludeList(ctxt->includes); 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->docTab != NULL) 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->docTab); 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->incTab != NULL) 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->incTab); 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->defTab != NULL) { 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->defNr; i++) 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeDefine(ctxt->defTab[i]); 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->defTab); 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->document != NULL) && (ctxt->freedoc)) 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormExtSpace: 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes the leading and ending spaces of the value 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string is modified "in situ" 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormExtSpace(xmlChar * value) 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *start = value; 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur = value; 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == start) { 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = cur; 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) { 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start = 0; 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start++ = *cur++; 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) { 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start = 0; 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't try to normalize the inner spaces */ 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == 0) { 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start = 0; 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *start++ = *cur++; 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupAttributes: 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a Relax-NG node 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the attributes on the given node 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr cur, next; 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node->properties; 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = cur->next; 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns == NULL) || 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "name")) { 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "element")) && 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "attribute")) && 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "ref")) && 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "parentRef")) && 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "param")) && 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "define"))) { 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "type")) { 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "value")) && 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "data"))) { 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "href")) { 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) && 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "include"))) { 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) { 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(node->name, BAD_CAST "start")) && 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(node->name, BAD_CAST "define"))) { 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s is not allowed on %s\n", 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, node->name); 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) { 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *val; 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlNodeListGetString(node->doc, cur->children, 1); 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) { 6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val[0] != 0) { 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURI((const char *) val); 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri == NULL) { 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_INVALID_URI, 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s contains invalid URI %s\n", 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, val); 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->scheme == NULL) { 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_URI_NOT_ABSOLUTE, 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s URI %s is not absolute\n", 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, val); 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->fragment != NULL) { 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_URI_FRAGMENT, 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s URI %s has a fragment ID\n", 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, val); 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(val); 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) { 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_ATTRIBUTE, 6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unknown attribute %s on %s\n", cur->name, 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name); 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next; 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTree: 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @root: an xmlNodePtr subtree 6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the subtree from unwanted nodes for parsing, resolve 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups. 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, delete; 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = NULL; 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = root; 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (delete != NULL) { 7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(delete); 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(delete); 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = NULL; 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.1. Annotations 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns == NULL) || 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent != NULL) && 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->type == XML_ELEMENT_NODE) && 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) || 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->parent->name, BAD_CAST "value")) || 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) { 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_FOREIGN_ELEMENT, 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "element %s doesn't allow foreign elements\n", 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent->name, NULL); 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupAttributes(ctxt, cur); 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) { 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href, *ns, *base, *URL; 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDocumentPtr docu; 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->parent; 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmp->type == XML_ELEMENT_NODE)) { 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(tmp, BAD_CAST "ns"); 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetProp(cur, BAD_CAST "href"); 7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href == NULL) { 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: externalRef has no href attribute\n", 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURI((const char *) href); 7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri == NULL) { 7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Incorrect URI for externalRef %s\n", 7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->fragment != NULL) { 7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Fragment forbidden in URI for externalRef %s\n", 7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = xmlNodeGetBase(cur->doc, cur); 7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL = xmlBuildURI(href, base); 7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) { 7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compute URL for externalRef %s\n", 7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project docu = xmlRelaxNGLoadExternalRef(ctxt, URL, ns); 7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (docu == NULL) { 7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE, 7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to load externalRef %s\n", URL, 7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->psvi = docu; 7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "include")) { 7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href, *ns, *base, *URL; 7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGIncludePtr incl; 7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetProp(cur, BAD_CAST "href"); 7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href == NULL) { 7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, 7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: include has no href attribute\n", 7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = xmlNodeGetBase(cur->doc, cur); 7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URL = xmlBuildURI(href, base); 7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) { 7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, 7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compute URL for include %s\n", 7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href, NULL); 7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href != NULL) 7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->parent; 7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && 7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmp->type == XML_ELEMENT_NODE)) { 7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(tmp, BAD_CAST "ns"); 7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns); 7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (incl == NULL) { 7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_INCLUDE_FAILURE, 7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to load include %s\n", URL, 7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URL); 7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->psvi = incl; 7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) || 7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->name, BAD_CAST "attribute"))) 7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name, *ns; 7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr text = NULL; 7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.8. name attribute of element 7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and attribute elements 7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlGetProp(cur, BAD_CAST "name"); 7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children == NULL) { 7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project text = 7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNewChild(cur, cur->ns, BAD_CAST "name", 7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name); 7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlNewDocNode(cur->doc, cur->ns, 7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "name", NULL); 7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node != NULL) { 7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAddPrevSibling(cur->children, node); 7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project text = xmlNewText(name); 7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAddChild(node, text); 7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project text = node; 7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (text == NULL) { 7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, XML_RNGP_CREATE_FAILURE, 7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to create a name %s element\n", 7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnsetProp(cur, BAD_CAST "name"); 7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (text != NULL) { 7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(text, BAD_CAST "ns", ns); 7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlUnsetProp(cur, BAD_CAST "ns"); */ 7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, 7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "attribute")) { 7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(text, BAD_CAST "ns", BAD_CAST ""); 7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) || 7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->name, BAD_CAST "nsName")) || 7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->name, BAD_CAST "value"))) { 7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.8. name attribute of element 7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and attribute elements 7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHasProp(cur, BAD_CAST "ns") == NULL) { 7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns = NULL; 7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = cur->parent; 7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && 7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_ELEMENT_NODE)) { 7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(node, BAD_CAST "ns"); 7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(cur, BAD_CAST "ns", BAD_CAST ""); 7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(cur, BAD_CAST "ns", ns); 7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "name")) { 7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name, *local, *prefix; 7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification: 4.10. QNames 7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlNodeGetContent(cur); 7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project local = xmlSplitQName2(name, &prefix); 7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (local != NULL) { 7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlSearchNs(cur->doc, cur, prefix); 7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) { 7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PREFIX_UNDEFINED, 7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: no namespace for prefix %s\n", 7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix, NULL); 7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(cur, BAD_CAST "ns", 7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->href); 7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetContent(cur, local); 7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(local); 7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(prefix); 7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4.16 7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "nsName")) { 7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, 7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found nsName/except//nsName forbidden construct\n", 7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) && 7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur != root)) { 7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldflags = ctxt->flags; 7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4.16 7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent != NULL) && 7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name, BAD_CAST "anyName"))) { 7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT; 7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupTree(ctxt, cur); 7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->parent != NULL) && 7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name, BAD_CAST "nsName"))) { 7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT; 7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupTree(ctxt, cur); 7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) { 7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4.16 7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) { 7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, 7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found anyName/except//anyName forbidden construct\n", 7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, cur, 7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, 7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found nsName/except//anyName forbidden construct\n", 7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Thisd is not an else since "include" is transformed 7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into a div 7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST "div")) { 7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns; 7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child, ins, tmp; 7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implements rule 4.11 7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlGetProp(cur, BAD_CAST "ns"); 7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = cur->children; 7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ins = cur; 7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlHasProp(child, BAD_CAST "ns")) { 7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSetProp(child, BAD_CAST "ns", ns); 7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = child->next; 7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(child); 7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ins = xmlAddNextSibling(ins, child); 7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = tmp; 7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since we are about to delete cur, if it's nsDef is non-NULL we 7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to preserve it (it contains the ns definitions for the 7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * children we just moved). We'll just stick it on to the end 7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of cur->parent's list, since it's never going to be re-serialized 7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (bug 143738). 7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nsDef != NULL) { 7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef; 7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (parDef->next != NULL) 7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parDef = parDef->next; 7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parDef->next = cur->nsDef; 7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsDef = NULL; 7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simplification 4.2 whitespaces 7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((cur->type == XML_TEXT_NODE) || 7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE)) { 7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_NODE(cur)) { 7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->parent->type == XML_ELEMENT_NODE) { 7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value")) 7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && 7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual 7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name, BAD_CAST "param"))) 7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = cur; 7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_children; 7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to next node 7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children->type != XML_ENTITY_DECL) && 7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->type != XML_ENTITY_REF_NODE) && 7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->type != XML_ENTITY_NODE)) { 7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip_children: 7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == root) { 7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = NULL; 7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (delete != NULL) { 7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode(delete); 7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(delete); 7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project delete = NULL; 7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupDoc: 7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: an xmldocPtr document pointer 7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the document from unwanted nodes for parsing, resolve 7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups. 7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the cleaned up document or NULL in case of error 7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr 7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc) 7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the root 7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL, NULL); 7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCleanupTree(ctxt, root); 7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (doc); 7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParse: 7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal 7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances. 7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built from the resource or 7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPtr 7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt) 7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr ret = NULL; 7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInitTypes(); 7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First step is to parse the input document into an DOM/Infoset 7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->URL != NULL) { 7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) ctxt->URL,NULL,0); 7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: could not load %s\n", ctxt->URL, 7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->buffer != NULL) { 7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0); 7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, 7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: could not parse schemas\n", NULL, 7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->document != NULL) { 7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = ctxt->document; 7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, NULL, XML_RNGP_EMPTY, 7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGParse: nothing to parse\n", NULL, NULL); 7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = doc; 7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some preprocessing of the document content 7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlRelaxNGCleanupDoc(ctxt, doc); 7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then do the parsing for good 7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngPErr(ctxt, (xmlNodePtr) doc, 7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL); 7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGParseDocument(ctxt, root); 7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->document); 7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the ref/defines links 7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * try to preprocess interleaves 7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->interleaves != NULL) { 7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(ctxt->interleaves, 7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt); 7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if there was a parsing error return NULL 7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbErrors > 0) { 7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFree(ret); 7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * try to compile (parts of) the schemas 7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) { 7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->topgrammar->start->type != XML_RELAXNG_START) { 7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr def; 7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def = xmlRelaxNGNewDefine(ctxt, NULL); 7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (def != NULL) { 7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->type = XML_RELAXNG_START; 7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project def->content = ret->topgrammar->start; 7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->topgrammar->start = def; 7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start); 7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Transfer the pointer for cleanup at the schema level. 7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->document = NULL; 7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->documents = ctxt->documents; 7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->documents = NULL; 7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->includes = ctxt->includes; 7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes = NULL; 7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->defNr = ctxt->defNr; 7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->defTab = ctxt->defTab; 7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->defTab = NULL; 7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->idref == 1) 7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->idref = 1; 7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserErrors: 7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error callback 7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning callback 7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks 7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a validation context 7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, 7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc err, 7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warn, void *ctx) 7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = err; 7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = warn; 7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = NULL; 7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetParserErrors: 7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error callback result 7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning callback result 7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks result 7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the callback information used to handle errors for a validation context 7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise. 7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, 7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc * err, 7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc * warn, void **ctx) 7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err != NULL) 7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *err = ctxt->error; 7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (warn != NULL) 7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *warn = ctxt->warning; 7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx != NULL) 7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctx = ctxt->userData; 7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserStructuredErrors: 7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG parser context 7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror: the error callback 7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks 7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a parsing context 7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt, 7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror, 7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *ctx) 7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = serror; 7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = NULL; 7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = NULL; 7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump back a compiled form * 7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGDumpDefine(FILE * output, 7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define); 7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefines: 7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines: a list of define structures 7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines) 7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefine(output, defines); 7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefine: 7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: a define structure 7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define) 7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) 7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<empty/>\n"); 7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<notAllowed/>\n"); 7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<text/>\n"); 7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<element>\n"); 7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<name"); 7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) 7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " ns=\"%s\"", define->ns); 7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">%s</name>\n", define->name); 7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->attrs); 7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</element>\n"); 7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST: 7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<list>\n"); 7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</list>\n"); 7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<oneOrMore>\n"); 7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</oneOrMore>\n"); 7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE: 7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<zeroOrMore>\n"); 7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</zeroOrMore>\n"); 7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE: 7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<choice>\n"); 7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</choice>\n"); 7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<group>\n"); 7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</group>\n"); 7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<interleave>\n"); 7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</interleave>\n"); 7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL: 7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<optional>\n"); 7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</optional>\n"); 7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<attribute>\n"); 7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</attribute>\n"); 7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<define"); 7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " name=\"%s\"", define->name); 7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</define>\n"); 7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<ref"); 7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " name=\"%s\"", define->name); 7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</ref>\n"); 7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<parentRef"); 7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " name=\"%s\"", define->name); 7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</parentRef>\n"); 7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<externalRef>"); 7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</externalRef>\n"); 7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE: 7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE: 7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO break; 7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO break; 7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefines(output, define->content); 7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpGrammar: 7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar: a grammar structure 7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @top: is this a top grammar 7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top) 7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) 7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<grammar"); 7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (top) 7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\""); 7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (grammar->combine) { 7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_COMBINE_UNDEFINED: 7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_COMBINE_CHOICE: 7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " combine=\"choice\""); 7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_COMBINE_INTERLEAVE: 7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " combine=\"interleave\""); 7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " <!-- invalid combine value -->"); 7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, ">\n"); 7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar->start == NULL) { 7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " <!-- grammar had no start -->"); 7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "<start>\n"); 7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpDefine(output, grammar->start); 7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</start>\n"); 7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO ? Dump the defines ? */ 7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "</grammar>\n"); 7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDump: 7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back 7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema) 7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) 7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG empty or failed to compile\n"); 7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG: "); 7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc == NULL) { 7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "no document\n"); 7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (schema->doc->URL != NULL) { 7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%s\n", schema->doc->URL); 7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->topgrammar == NULL) { 7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG has no top grammar\n"); 7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1); 7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpTree: 7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output 7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the transformed RelaxNG tree. 7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) 7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) 7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RelaxNG empty or failed to compile\n"); 7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->doc == NULL) { 7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "no document\n"); 7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocDump(output, schema->doc); 7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation of compiled content * 7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define); 7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledCallback: 7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: the regular expression instance 7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the token which matched 7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata: callback data, the define for the subelement if available 7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata: callback data, the Relax NG validation context 7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children. 7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, 7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * token, 7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *transdata, void *inputdata) 7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; 7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; 7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Compiled callback for: '%s'\n", token); 7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing context\n", token); 7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) { 7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token[0] == '#') 7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing define\n", token); 7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (define == NULL)) { 7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing info\n", token); 7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (define->type != XML_RELAXNG_ELEMENT) { 7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s define is not element\n", token); 7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_RELAXNG_OK) 7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, define); 7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->perr = ret; 7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledContent: 7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the RelaxNG validation context 7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the regular expression as compiled 7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: list of children to test against the regexp 7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the content model of an element or start using the regexp 7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error. 7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, 7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr regexp, xmlNodePtr content) 7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldperr; 7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (regexp == NULL)) 7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldperr = ctxt->perr; 7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(regexp, 7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateCompiledCallback, ctxt); 7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->perr = 0; 7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = content; 7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = cur; 7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlIsBlankNode(cur)) 7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt); 7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, 7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->parent->name); 7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns != NULL) { 8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString2(exec, cur->name, 8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->href, ctxt); 8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, cur->name, ctxt); 8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name); 8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to next element 8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, NULL, NULL); 8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: get some of the names needed to exit the current state of exec 8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); 8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There might be content model errors outside of the pure 8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * regexp validation, e.g. for attribute values. 8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->perr != 0)) { 8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->perr; 8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->perr = oldperr; 8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Progressive validation of when possible * 8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines); 8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, 8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dolog); 8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); 8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPush: 8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: the regexp runtime for the new content model 8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new regexp for the current node content model on the stack 8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec) 8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab == NULL) { 8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemMax = 10; 8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax * 8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRegExecCtxtPtr)); 8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab == NULL) { 8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemNr >= ctxt->elemMax) { 8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemMax *= 2; 8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab, 8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemMax * 8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof 8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRegExecCtxtPtr)); 8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab == NULL) { 8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab[ctxt->elemNr++] = exec; 8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elem = exec; 8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPop: 8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the regexp of the current node content model from the stack 8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the exec or NULL if empty 8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegExecCtxtPtr 8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt) 8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr ret; 8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemNr <= 0) 8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemNr--; 8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->elemTab[ctxt->elemNr]; 8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elemTab[ctxt->elemNr] = NULL; 8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemNr > 0) 8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1]; 8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->elem = NULL; 8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateProgressiveCallback: 8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: the regular expression instance 8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the token which matched 8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata: callback data, the define for the subelement if available 8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata: callback data, the Relax NG validation context 8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children. 8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some of the in/out informations are passed via the context in @inputdata. 8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec 8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ATTRIBUTE_UNUSED, 8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * token, 8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *transdata, void *inputdata) 8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; 8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; 8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state, oldstate; 8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, oldflags; 8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Progressive callback for: '%s'\n", token); 8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing context\n", token); 8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ctxt->pnode; 8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = 1; 8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) { 8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token[0] == '#') 8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing define\n", token); 8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (define == NULL)) { 8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s missing info\n", token); 8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) 8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (define->type != XML_RELAXNG_ELEMENT) { 8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "callback on %s define is not element\n", token); 8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_RELAXNG_OK) 8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; 8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) { 8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOTELEM); 8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel == NULL) { 8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this node cannot be validated in a streamable fashion 8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element '%s' validation is not streamable\n", 8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project token); 8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = 0; 8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pdef = define; 8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(define->contModel, 8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateProgressiveCallback, ctxt); 8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) { 8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGElemPush(ctxt, exec); 8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the attributes part of the content. 8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, node); 8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->attrs != NULL) { 8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); 8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); 8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp = -1, i; 8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validation error, log the message for the "best" one 8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGLogBestError(ctxt); 8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); 8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (tmp == -1)) 8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = -1; 8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->pstate == -1) { 8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushElement: 8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new element start on the RelaxNG validation stack. 8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 if validating the 8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element requires a full node, and -1 in case of error. 8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, 8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc ATTRIBUTE_UNUSED, 8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) 8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (elem == NULL)) 8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name); 8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elem == 0) { 8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; 8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; 8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define; 8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = ctxt->schema; 8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = schema->topgrammar; 8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((grammar == NULL) || (grammar->start == NULL)) { 8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define = grammar->start; 8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel == NULL) { 8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pdef = define; 8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(define->contModel, 8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateProgressiveCallback, 8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) { 8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGElemPush(ctxt, exec); 8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pnode = elem; 8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pstate = 0; 8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->ns != NULL) { 8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href, 8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt); 8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name); 8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->pstate == 0) 8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->pstate < 0) 8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", 8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name); 8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushCData: 8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the RelaxNG validation context 8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: some character data read 8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the lenght of the data 8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the CData parsed for validation in the current stack 8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 otherwise 8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, 8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * data, int len ATTRIBUTE_UNUSED) 8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL)) 8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len); 8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*data != 0) { 8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_BLANK_CH(*data)) 8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data++; 8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*data == 0) 8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt); 8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO "); 8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "CDATA failed\n"); 8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePopElement: 8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the RelaxNG validation context 8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the element end from the RelaxNG validation stack. 8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise 8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt, 8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc ATTRIBUTE_UNUSED, 8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) 8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL)) 8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name); 8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * verify that we reached a terminal state of the content model. 8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRelaxNGElemPop(ctxt); 8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, NULL, NULL); 8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: get some of the names needed to exit the current state of exec 8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); 8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n", 8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name); 8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateFullElement: 8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a full subtree when xmlRelaxNGValidatePushElement() returned 8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 and the content of the node has been expanded. 8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 in case of error. 8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, 8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc ATTRIBUTE_UNUSED, 8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) 8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL)) 8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name); 8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, elem->parent); 8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->seq = elem; 8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_OK; 8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef); 8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK)) 8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 8472df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGFreeValidState(ctxt, ctxt->state); 8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE 8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", 8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name); 8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generic interpreted validation implementation * 8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define); 8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSkipIgnored: 8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the top node. 8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip ignorable nodes in that context 8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new sibling or NULL in case of error. 8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node) 8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO complete and handle entities 8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && 8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node->type == XML_COMMENT_NODE) || 8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_PI_NODE) || 8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_XINCLUDE_START) || 8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_XINCLUDE_END) || 8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((node->type == XML_TEXT_NODE) || 8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE)) && 8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->flags & FLAGS_MIXED_CONTENT) || 8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_BLANK_NODE(node)))))) { 8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->next; 8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (node); 8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormalize: 8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string to normalize 8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the normalizeWhiteSpace( s ) function from 8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * section 6.2.9 of the spec 8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL in case of error. 8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str) 8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret, *p; 8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) 8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = str; 8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*tmp != 0) 8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp++; 8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = tmp - str; 8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); 8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p = ret; 8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*str)) 8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str++; 8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*str != 0) { 8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(*str)) { 8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*str)) 8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str++; 8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*str == 0) 8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *p++ = ' '; 8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *p++ = *str++; 8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *p = 0; 8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDatatype: 8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the string value 8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the datatype definition 8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given value against the dataype 8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt, 8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * value, 8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, xmlNodePtr node) 8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret, tmp; 8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *result = NULL; 8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define == NULL) || (define->data == NULL)) { 8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) define->data; 8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->check != NULL) { 8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->attrs != NULL) && 8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (define->attrs->type == XML_RELAXNG_PARAM)) { 8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->check(lib->data, define->name, value, &result, node); 8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = lib->check(lib->data, define->name, value, NULL, node); 8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name); 8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) 8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef(lib->data, result); 8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 2) { 8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value); 8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value); 8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = define->attrs; 8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) { 8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lib->facet != NULL) { 8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = lib->facet(lib->data, define->name, cur->name, 8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->value, value, result); 8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (define->content != NULL)) { 8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *oldvalue, *oldendvalue; 8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldendvalue = ctxt->state->endvalue; 8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = (xmlChar *) value; 8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = NULL; 8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, define->content); 8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = (xmlChar *) oldvalue; 8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = (xmlChar *) oldendvalue; 8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) 8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib->freef(lib->data, result); 8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNextValue: 8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to the next value when validating within a list 8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the operation succeeded or an error code. 8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) 8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur; 8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->value; 8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (ctxt->state->endvalue == NULL)) { 8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = NULL; 8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = NULL; 8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) 8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((cur != ctxt->state->endvalue) && (*cur == 0)) 8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->state->endvalue) 8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = NULL; 8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = cur; 8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueList: 8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines: the list of definitions to verify 8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given set of definitions for the current value 8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, 8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, defines); 8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValue: 8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definition for the current value 8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, oldflags; 8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ctxt->state->value; 8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY:{ 8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value != NULL) && (value[0] != 0)) { 8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idx = 0; 8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(value[idx])) 8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project idx++; 8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value[idx] != 0) 8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE:{ 8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(value, define->value)) { 8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGTypeLibraryPtr lib; 8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lib = (xmlRelaxNGTypeLibraryPtr) define->data; 8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((lib != NULL) && (lib->comp != NULL)) { 8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = lib->comp(lib->data, define->name, 8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->value, define->node, 8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) define->attrs, 8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, ctxt->state->node); 8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, 8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->name); 8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *nval, *nvalue; 8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: trivial optimizations are possible by 8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computing at compile-time 8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nval = xmlRelaxNGNormalize(ctxt, define->value); 8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nvalue = xmlRelaxNGNormalize(ctxt, value); 8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nval == NULL) || (nvalue == NULL) || 8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(nval, nvalue))) 8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nval != NULL) 8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nval); 8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nvalue != NULL) 8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nvalue); 8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNextValue(ctxt); 8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE:{ 8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDatatype(ctxt, value, define, 8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNextValue(ctxt); 8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue; 8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, 0); 8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST:{ 8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = define->content; 8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue, *oldend, *val, *cur; 8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_values = 0; 8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldend = ctxt->state->endvalue; 8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStrdup(oldvalue); 8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStrdup(BAD_CAST ""); 8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = val; 8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(*cur)) { 8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = 0; 8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_values++; 8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) 8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur++ = 0; 8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "list value: '%s' found %d items\n", 8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue, nb_values); 8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_values = 0; 8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = cur; 8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = val; 8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == 0) && (cur != ctxt->state->endvalue)) 8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = cur; 8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->value == ctxt->state->endvalue) 8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = NULL; 8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to validate value: '%s' with %d rule\n", 8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value, nb_values); 8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST 8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_values++; 8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->state->value != NULL) && 8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->state->value != ctxt->state->endvalue)) { 8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, 8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value); 8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(val); 8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = oldend; 8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValueList(ctxt, define->content); 8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE:{ 8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur, *temp; 8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8887df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->state->value == NULL) || 8888df143a5041f03a22808b59c76698770b74692815Selim Gurun (*ctxt->state->value == 0)) { 8889df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 0; 8890df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8891df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->value; 8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = NULL; 8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((cur != NULL) && (cur != ctxt->state->endvalue) && 8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (temp != cur)) { 8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = cur; 8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateValueList(ctxt, define->content); 8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = temp; 8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->value; 8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, 0); 8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8913df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_RELAXNG_OPTIONAL:{ 8914df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar *temp; 8915df143a5041f03a22808b59c76698770b74692815Selim Gurun 8916df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->state->value == NULL) || 8917df143a5041f03a22808b59c76698770b74692815Selim Gurun (*ctxt->state->value == 0)) { 8918df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 0; 8919df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8920df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8921df143a5041f03a22808b59c76698770b74692815Selim Gurun oldflags = ctxt->flags; 8922df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->flags |= FLAGS_IGNORABLE; 8923df143a5041f03a22808b59c76698770b74692815Selim Gurun temp = ctxt->state->value; 8924df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlRelaxNGValidateValue(ctxt, define->content); 8925df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->flags = oldflags; 8926df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ret != 0) { 8927df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->state->value = temp; 8928df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->errNr > 0) 8929df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGPopErrors(ctxt, 0); 8930df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 0; 8931df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8932df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8933df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->errNr > 0) 8934df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGPopErrors(ctxt, 0); 8935df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 8936df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT:{ 8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP:{ 8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, list); 8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 897060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (define->content == NULL) { 8971df143a5041f03a22808b59c76698770b74692815Selim Gurun VALID_ERR(XML_RELAXNG_ERR_NODEFINE); 8972df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = -1; 8973df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 8974df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlRelaxNGValidateValue(ctxt, define->content); 8975df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = -1; 8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueContent: 8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines: the list of definitions to verify 8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definitions for the current value 8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt, 8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, defines); 9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAttributeMatch: 9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to check 9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prop: the attribute 9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the attribute matches the definition nameClass 9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the attribute matches, 0 if no, or -1 in case of error 9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, 9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, xmlAttrPtr prop) 9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(define->name, prop->name)) 9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) { 9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns[0] == 0) { 9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prop->ns != NULL) 9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prop->ns == NULL) || 9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(define->ns, prop->ns->href))) 9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->nameClass == NULL) 9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define = define->nameClass; 9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->type == XML_RELAXNG_EXCEPT) { 9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); 9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO} 9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttribute: 9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given attribute definition for that node 9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt, 9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i; 9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value, *oldvalue; 9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr prop = NULL, tmp; 9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldseq; 9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->nbAttrLeft <= 0) 9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->state->nbAttrs; i++) { 9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->state->attrs[i]; 9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) { 9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((((define->ns == NULL) || (define->ns[0] == 0)) && 9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmp->ns == NULL)) || 9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((tmp->ns != NULL) && 9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(define->ns, tmp->ns->href)))) { 9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prop = tmp; 9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prop != NULL) { 9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = xmlNodeListGetString(prop->doc, prop->children, 1); 9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldseq = ctxt->state->seq; 9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = (xmlNodePtr) prop; 9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = value; 9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = NULL; 9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValueContent(ctxt, define->content); 9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->value != NULL) 9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ctxt->state->value; 9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value != NULL) 9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value); 9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = oldseq; 9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flag the attribute as processed 9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->attrs[i] = NULL; 9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->nbAttrLeft--; 9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateAttribute(%s): %d\n", 9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->name, ret); 9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->state->nbAttrs; i++) { 9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->state->attrs[i]; 9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && 9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) { 9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prop = tmp; 9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prop != NULL) { 9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = xmlNodeListGetString(prop->doc, prop->children, 1); 9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldseq = ctxt->state->seq; 9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = (xmlNodePtr) prop; 9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = value; 9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValueContent(ctxt, define->content); 9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state->value != NULL) 9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ctxt->state->value; 9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value != NULL) 9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value); 9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = oldseq; 9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flag the attribute as processed 9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->attrs[i] = NULL; 9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->nbAttrLeft--; 9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->ns != NULL) { 9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n", 9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->ns, ret); 9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateAttribute(anyName): %d\n", 9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret); 9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttributeList: 9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the list of definition to verify 9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node against the list of attribute definitions 9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, res; 9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int needmore = 0; 9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = defines; 9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_RELAXNG_ATTRIBUTE) { 9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0) 9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project needmore = 1; 9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!needmore) 9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = defines; 9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_RELAXNG_ATTRIBUTE) { 9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) || (ctxt->states != NULL)) { 9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlRelaxNGValidateDefinition(ctxt, cur); 9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res < 0) 9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == -1) /* continues on -2 */ 9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNodeMatchesList: 9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node 9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list: a NULL terminated array of definitions 9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a node can be matched by one of the definitions 9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches 0 otherwise 9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list) 9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr cur; 9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0, tmp; 9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node == NULL) || (list == NULL)) 9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = list[i++]; 9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_ELEMENT_NODE) && 9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_ELEMENT)) { 9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGElementMatch(NULL, cur, node); 9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((node->type == XML_TEXT_NODE) || 9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE)) && 9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_RELAXNG_TEXT)) { 9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = list[i++]; 9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateInterleave: 9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate an interleave definition for a node. 9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, 9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i, nbgroups; 9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errNr = ctxt->errNr; 9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldflags; 9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr oldstate; 9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPartitionPtr partitions; 9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGInterleaveGroupPtr group = NULL; 9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem; 9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *list = NULL, *lasts = NULL; 9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->data != NULL) { 9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions = (xmlRelaxNGPartitionPtr) define->data; 9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbgroups = partitions->nbgroups; 9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_INTERNODATA); 9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimizations for MIXED 9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->dflags & IS_MIXED) { 9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_MIXED_CONTENT; 9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbgroups == 2) { 9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a pure <mixed> case 9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, 9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT) 9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, 9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->groups[1]-> 9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule); 9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, 9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project partitions->groups[0]-> 9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule); 9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, 9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state-> 9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq); 9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build arrays to store the first and last node of the chain 9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pertaining to each group 9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); 9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(list, 0, nbgroups * sizeof(xmlNodePtr)); 9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); 9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts == NULL) { 9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(lasts, 0, nbgroups * sizeof(xmlNodePtr)); 9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Walk the sequence of children finding the right group and 9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * sorting them in sequences. 9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->seq; 9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur); 9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = cur; 9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = cur; 9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((partitions->triage != NULL) && 9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (partitions->flags & IS_DETERMINIST)) { 9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *tmp = NULL; 9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_TEXT_NODE) || 9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE)) { 9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text", 9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_ELEMENT_NODE) { 9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns != NULL) { 9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashLookup2(partitions->triage, cur->name, 9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->href); 9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlHashLookup2(partitions->triage, 9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "#any", 9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->href); 9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(partitions->triage, cur->name, 9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(partitions->triage, BAD_CAST "#any", 9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = nbgroups; 9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = ((long) tmp) - 1; 9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (partitions->flags & IS_NEEDCHECK) { 9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[i]; 9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) 9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = nbgroups; 9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) { 9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[i]; 9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (group == NULL) 9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGNodeMatchesList(cur, group->defs)) 9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We break as soon as an element not matched is found 9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= nbgroups) { 9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts[i] != NULL) { 9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i]->next = cur; 9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i] = cur; 9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[i] = cur; 9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i] = cur; 9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) 9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastchg = cur->next; 9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastchg = cur; 9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur->next); 9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastelem = cur; 9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbgroups; i++) { 9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); 9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project group = partitions->groups[i]; 9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts[i] != NULL) { 9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = lasts[i]->next; 9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i]->next = NULL; 9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = list[i]; 9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); 9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->state->seq; 9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur); 9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); 9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j; 9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int best = -1; 9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lowattr = -1; 9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PBM: what happen if there is attributes checks in the interleaves 9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; j++) { 9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->states->tabState[j]->seq; 9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlRelaxNGSkipIgnored(ctxt, cur); 9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (found == 0) { 9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { 9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* try to keep the latest one to mach old heuristic */ 9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lowattr == 0) 9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (found == 0) { 9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lowattr == -1) { 9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { 9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* try to keep the latest one to mach old heuristic */ 9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lowattr = ctxt->states->tabState[j]->nbAttrLeft; 9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = j; 9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BIG PBM: here we pick only one restarting point :-( 9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states->nbState > 0) { 9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (best != -1) { 9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->states->tabState[best]; 9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[best] = NULL; 9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = 9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[ctxt->states->nbState - 1]; 9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[ctxt->states->nbState - 1] = NULL; 9482df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->nbState--; 9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState ; j++) { 9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]); 9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (found == 0) { 9491df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) { 9492df143a5041f03a22808b59c76698770b74692815Selim Gurun VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, 9493df143a5041f03a22808b59c76698770b74692815Selim Gurun (const xmlChar *) "noname"); 9494df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 9495df143a5041f03a22808b59c76698770b74692815Selim Gurun VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); 9496df143a5041f03a22808b59c76698770b74692815Selim Gurun } 9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lasts[i] != NULL) { 9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lasts[i]->next = last; 9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = lastelem; 9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project done: 9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * builds the next links chain from the prev one 9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = lastchg; 9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == start) || (cur->prev == NULL)) 9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prev->next = cur; 9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(lasts); 9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinitionList: 9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the list of definition to verify 9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node content against the (list) of definitions 9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt, 9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr defines) 9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, res; 9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (defines == NULL) { 9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_INTERNAL, 9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "NULL definition list"); 9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (defines != NULL) { 9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) || (ctxt->states != NULL)) { 9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlRelaxNGValidateDefinition(ctxt, defines); 9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res < 0) 9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOSTATE); 9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == -1) /* continues on -2 */ 9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defines = defines->next; 9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElementMatch: 9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to check 9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element 9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the element matches the definition nameClass 9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the element matches, 0 if no, or -1 in case of error 9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define, xmlNodePtr elem) 9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, oldflags = 0; 9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) { 9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(elem->name, define->name)) { 9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name); 9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->ns != NULL) && (define->ns[0] != 0)) { 9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->ns == NULL) { 9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name); 9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrEqual(elem->ns->href, define->ns)) { 9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS, 9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, define->ns); 9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((elem->ns != NULL) && (define->ns != NULL) && 9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (define->name == NULL)) { 9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name); 9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((elem->ns != NULL) && (define->name != NULL)) { 9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name); 9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->nameClass == NULL) 9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define = define->nameClass; 9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->type == XML_RELAXNG_EXCEPT) { 9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGElementMatch(ctxt, list, elem); 9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (define->type == XML_RELAXNG_CHOICE) { 9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list; 9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->nameClass; 9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGElementMatch(ctxt, list, elem); 9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > 0) 9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, 0); 9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = -1; 9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGBestState: 9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report 9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about. I.e. a state with no element left in the child list 9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or the one with the less attributes left. 9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is called only if a falidation error was detected 9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the index of the "best" state or -1 in case of error 9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt) 9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, tmp; 9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int best = -1; 9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value = 1000000; 9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->states == NULL) || 9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->states->nbState <= 0)) 9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->seq != NULL) { 9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((best == -1) || (value > 100000)) { 9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = 100000; 9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = i; 9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = state->nbAttrLeft; 9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((best == -1) || (value > tmp)) { 9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = tmp; 9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = i; 9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (best); 9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLogBestError: 9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report 9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about and log it. 9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt) 9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int best; 9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->states == NULL) || 9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->states->nbState <= 0)) 9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project best = xmlRelaxNGBestState(ctxt); 9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((best >= 0) && (best < ctxt->states->nbState)) { 9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = ctxt->states->tabState[best]; 9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateElementEnd(ctxt, 1); 9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateElementEnd: 9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dolog: indicate that error logging should be done 9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the end of the element, implements check that 9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there is nothing left not consumed in the element content 9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or in the attribute list. 9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog) 9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->seq != NULL) { 9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq); 9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->seq != NULL) { 9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dolog) { 9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT, 9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, state->seq->name); 9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < state->nbAttrs; i++) { 9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->attrs[i] != NULL) { 9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dolog) { 9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR, 9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->attrs[i]->name, state->node->name); 9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1 - i); 9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateState: 9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current state against the definition 9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt, 9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i, tmp, oldflags, errNr; 9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr oldstate = NULL, state; 9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define == NULL) { 9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NODEFINE); 9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ctxt->state->seq; 9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = NULL; 9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->depth; i++) 9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " "); 9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Start validating %s ", xmlRelaxNGDefName(define)); 9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s ", define->name); 9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && (node->name != NULL)) 9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name); 9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "\n"); 9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->depth++; 9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (define->type) { 9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EMPTY: 9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOT_ALLOWED: 9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_TEXT: 9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((node != NULL) && 9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node->type == XML_TEXT_NODE) || 9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_COMMENT_NODE) || 9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_PI_NODE) || 9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE))) 9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->next; 9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = node; 9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ELEMENT: 9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) { 9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name); 9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) { 9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOTELEM); 9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This node was already validated successfully against 9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this definition. 9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->psvi == define) { 9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); 9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr != 0) { 9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ctxt->err != NULL) && 9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) 9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(ctxt->err->arg2, node->name))) 9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || 9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->err->err == 9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ERR_ELEMEXTRANS) 9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(ctxt->err->arg1, node->name))) 9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) 9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || (ctxt->err->err == 9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_RELAXNG_ERR_NOTELEM))) 9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPop(ctxt); 9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGElementMatch(ctxt, define, node); 9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret <= 0) { 9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr != 0) { 9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ctxt->err != NULL) && 9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && 9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->err->arg2, node->name))) || 9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && 9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->err->arg1, node->name))) || 9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || 9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) 9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidErrorPop(ctxt); 9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & FLAGS_MIXED_CONTENT) { 9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags -= FLAGS_MIXED_CONTENT; 9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, node); 9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) 9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->attrs != NULL) { 9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); 9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); 9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->contModel != NULL) { 9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state; 9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr tmpstates = ctxt->states; 9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr nseq; 9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nstate = xmlRelaxNGNewValidState(ctxt, node); 9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = nstate; 9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGValidateCompiledContent(ctxt, 9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->contModel, 9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nseq = ctxt->state->seq; 9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = tmpstate; 9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = tmpstates; 9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, nstate); 9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE 9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Validating content of '%s' : %d\n", 9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->name, tmp); 9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) 9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = -1; 9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = nseq; 9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validation error, log the message for the "best" one 9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGLogBestError(ctxt); 9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states-> 9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tabState[i]); 9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (tmp == -1)) 9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = nseq; 9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->content != NULL) { 10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGValidateDefinitionList(ctxt, 10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define-> 10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content); 10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state == NULL) { 10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, 10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name); 10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, 10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name); 10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = -1; 10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { 10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != 0) { 10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validation error, log the message for the "best" one 10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGLogBestError(ctxt); 10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 10043df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[i]); 10044df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[i] = NULL; 10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (tmp == -1)) 10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateElementEnd(ctxt, 1); 10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->psvi = define; 10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldstate != NULL) 10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); 10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -2; 10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlRelaxNGValidateDefinition(): validated %s : %d", 10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name, ret); 10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldstate == NULL) 10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": no state\n"); 10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (oldstate->seq == NULL) 10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": done\n"); 10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (oldstate->seq->type == XML_ELEMENT_NODE) 10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": next elem %s\n", 10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate->seq->name); 10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ": next %s %d\n", 10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate->seq->name, oldstate->seq->type); 10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_OPTIONAL:{ 10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); 10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidateDefinitionList(ctxt, 10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define->content); 10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) 10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); 10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = xmlRelaxNGNewStates(ctxt, 1); 10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) { 10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); 10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state); 10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ONEORMORE: 10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); 10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ZEROORMORE:{ 10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int progress; 10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states = NULL, res = NULL; 10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int base, j; 10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlRelaxNGNewStates(ctxt, 1); 10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) { 10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All the input states are also exit states 10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCopyValidState(ctxt, 10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt-> 10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state)); 10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; j++) { 10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10166df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGCopyValidState(ctxt, 10167df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[j])); 10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 0; 10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = res->nbState; 10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < states->nbState; i++) { 10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = states->tabState[i]; 10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, 10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define-> 10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content); 10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGAddStates(ctxt, res, 10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state); 10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; 10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j++) { 10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10196df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[j]); 10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, 10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states); 10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state); 10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, 10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project define-> 10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content); 10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = res->nbState; 10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGAddStates(ctxt, res, 10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state); 10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < ctxt->states->nbState; j++) { 10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRelaxNGAddStates(ctxt, res, 10230df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->states->tabState[j]); 10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == 1) 10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, 10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states); 10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (progress) { 10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Collect all the new nodes added at that step 10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and make them the new node set 10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->nbState - base == 1) { 10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlRelaxNGCopyValidState(ctxt, 10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res-> 10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tabState 10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project [base]); 10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGNewStates(ctxt, 10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res->nbState - base); 10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 0; 10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->nbState = 0; 10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = base; i < res->nbState; i++) 10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, states, 10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGCopyValidState 10268df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt, res->tabState[i])); 10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = states; 10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (progress == 1); 10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states != NULL) { 10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = res; 10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors may have to be propagated back... 10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_CHOICE:{ 10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr list = NULL; 10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states = NULL; 10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project errNr = ctxt->errNr; 10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((define->dflags & IS_TRIABLE) && (define->data != NULL) && 10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node != NULL)) { 10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node == NULL can't be optimized since IS_TRIABLE 10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't account for choice which may lead to 10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only attributes. 10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr triage = 10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashTablePtr) define->data; 10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Something we can optimize cleanly there is only one 10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possble branch out ! 10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_TEXT_NODE) || 10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_CDATA_SECTION_NODE)) { 10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, BAD_CAST "#text", NULL); 10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (node->type == XML_ELEMENT_NODE) { 10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns != NULL) { 10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = xmlHashLookup2(triage, node->name, 10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->ns->href); 10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, BAD_CAST "#any", 10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->ns->href); 10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, node->name, NULL); 10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = 10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(triage, BAD_CAST "#any", 10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name); 10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, list); 10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = define->content; 10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (list != NULL) { 10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); 10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, list); 10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states == NULL) { 10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = xmlRelaxNGNewStates(ctxt, 1); 10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, states, ctxt->state); 10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, states, 10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states-> 10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tabState[i]); 10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = list->next; 10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states != NULL) { 10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, oldstate); 10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = states; 10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { 10379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNr > errNr) 10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPopErrors(ctxt, errNr); 10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DEF: 10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_GROUP: 10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); 10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_INTERLEAVE: 10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateInterleave(ctxt, define); 10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_ATTRIBUTE: 10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateAttribute(ctxt, define); 10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_START: 10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_NOOP: 10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_REF: 10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXTERNALREF: 10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARENTREF: 10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, define->content); 10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_DATATYPE:{ 10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content = NULL; 10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node; 10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_DATAELEM, 10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name); 10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((child->type == XML_TEXT_NODE) || 10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) { 10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrcat(content, child->content); 10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle entities ... */ 10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrdup(BAD_CAST ""); 10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDatatype(ctxt, content, define, 10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq); 10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name); 10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_VALUE:{ 10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content = NULL; 10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue; 10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node; 10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_VALELEM, 10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name); 10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((child->type == XML_TEXT_NODE) || 10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) { 10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrcat(content, child->content); 10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle entities ... */ 10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrdup(BAD_CAST ""); 10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = content; 10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, define); 10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name); 10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 0) { 10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = NULL; 10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_LIST:{ 10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content; 10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *oldvalue, *oldendvalue; 10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Make sure it's only text nodes 10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = NULL; 10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = node; 10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR2(XML_RELAXNG_ERR_LISTELEM, 10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->parent->name); 10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((child->type == XML_TEXT_NODE) || 10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) { 10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrcat(content, child->content); 10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle entities ... */ 10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlStrdup(BAD_CAST ""); 10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(ctxt, "validating\n"); 10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlStrlen(content); 10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldvalue = ctxt->state->value; 10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldendvalue = ctxt->state->endvalue; 10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = content; 10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = content + len; 10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateValue(ctxt, define); 10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->value = oldvalue; 10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->endvalue = oldendvalue; 10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_LIST); 10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((ret == 0) && (node != NULL)) { 10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->seq = node->next; 10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_EXCEPT: 10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_RELAXNG_PARAM: 10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO ret = -1; 10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->depth--; 10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->depth; i++) 10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " "); 10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Validating %s ", xmlRelaxNGDefName(define)); 10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (define->name != NULL) 10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s ", define->name); 10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "suceeded\n"); 10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "failed\n"); 10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinition: 10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define: the definition to verify 10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current node lists against the definition 10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDefinePtr define) 10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGStatesPtr states, res; 10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, k, ret, oldflags; 10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should NOT have both ctxt->state and ctxt->states 10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) { 10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = ctxt->states->tabState[0]; 10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateState(ctxt, define); 10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) { 10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = ctxt->states->tabState[0]; 10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states = ctxt->states; 10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j = 0; 10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldflags = ctxt->flags; 10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags |= FLAGS_IGNORABLE; 10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < states->nbState; i++) { 10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = states->tabState[i]; 10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateState(ctxt, define); 10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should NOT have both ctxt->state and ctxt->states 10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) { 10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add the state to the container */ 10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, ctxt->state); 10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add the state directly in states */ 10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[j++] = ctxt->state; 10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) { 10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* make it the new container and copy other results */ 10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = ctxt->states; 10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < j; k++) 10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->tabState[k]); 10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add all the new results to res and reff the container */ 10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->states->nbState; k++) 10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGAddStates(ctxt, res, 10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[k]); 10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->states->nbState; k++) 10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, 10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states->tabState[k]); 10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->flags = oldflags; 10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = res; 10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (j > 1) { 10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->nbState = j; 10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = states; 10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (j == 1) { 10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = states->tabState[0]; 10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, states); 10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(ctxt, ctxt->states); 10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (ctxt->states != NULL)) { 10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDocument: 10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given document 10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code. 10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) 10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGPtr schema; 10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGGrammarPtr grammar; 10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidStatePtr state; 10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL)) 10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_RELAXNG_OK; 10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = ctxt->schema; 10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project grammar = schema->topgrammar; 10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (grammar == NULL) { 10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); 10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = xmlRelaxNGNewValidState(ctxt, NULL); 10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = state; 10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start); 10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->state != NULL) && (state->seq != NULL)) { 10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->state; 10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = state->seq; 10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node != NULL) { 10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != -1) { 10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); 10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->states != NULL) { 10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp = -1; 10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ctxt->states->nbState; i++) { 10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states->tabState[i]; 10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = state->seq; 10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlRelaxNGSkipIgnored(ctxt, node); 10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = 0; 10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, state); 10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == -1) { 10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != -1) { 10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); 10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->state != NULL) { 10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(ctxt, ctxt->state); 10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->errNr != 0) { 10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error(ctxt->userData, 10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "%d Extra error messages left on stack !\n", 10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNr); 10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGDumpValidError(ctxt); 10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->idref == 1) { 10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidCtxt vctxt; 10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&vctxt, 0, sizeof(xmlValidCtxt)); 10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.valid = 1; 10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.error = ctxt->error; 10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.warning = ctxt->warning; 10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.userData = ctxt->userData; 10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateDocumentFinal(&vctxt, doc) != 1) 10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK)) 10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10790df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 10791df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGCleanPSVI: 10792df143a5041f03a22808b59c76698770b74692815Selim Gurun * @node: an input element or document 10793df143a5041f03a22808b59c76698770b74692815Selim Gurun * 10794df143a5041f03a22808b59c76698770b74692815Selim Gurun * Call this routine to speed up XPath computation on static documents. 10795df143a5041f03a22808b59c76698770b74692815Selim Gurun * This stamps all the element nodes with the document order 10796df143a5041f03a22808b59c76698770b74692815Selim Gurun * Like for line information, the order is kept in the element->content 10797df143a5041f03a22808b59c76698770b74692815Selim Gurun * field, the value stored is actually - the node number (starting at -1) 10798df143a5041f03a22808b59c76698770b74692815Selim Gurun * to be able to differentiate from line numbers. 10799df143a5041f03a22808b59c76698770b74692815Selim Gurun * 10800df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the number of elements found in the document or -1 in case 10801df143a5041f03a22808b59c76698770b74692815Selim Gurun * of error. 10802df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 10803df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 10804df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGCleanPSVI(xmlNodePtr node) { 10805df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlNodePtr cur; 10806df143a5041f03a22808b59c76698770b74692815Selim Gurun 10807df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((node == NULL) || 10808df143a5041f03a22808b59c76698770b74692815Selim Gurun ((node->type != XML_ELEMENT_NODE) && 10809df143a5041f03a22808b59c76698770b74692815Selim Gurun (node->type != XML_DOCUMENT_NODE) && 10810df143a5041f03a22808b59c76698770b74692815Selim Gurun (node->type != XML_HTML_DOCUMENT_NODE))) 10811df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 10812df143a5041f03a22808b59c76698770b74692815Selim Gurun if (node->type == XML_ELEMENT_NODE) 10813df143a5041f03a22808b59c76698770b74692815Selim Gurun node->psvi = NULL; 10814df143a5041f03a22808b59c76698770b74692815Selim Gurun 10815df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = node->children; 10816df143a5041f03a22808b59c76698770b74692815Selim Gurun while (cur != NULL) { 10817df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_ELEMENT_NODE) { 10818df143a5041f03a22808b59c76698770b74692815Selim Gurun cur->psvi = NULL; 10819df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->children != NULL) { 10820df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->children; 10821df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 10822df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10823df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10824df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->next != NULL) { 10825df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->next; 10826df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 10827df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10828df143a5041f03a22808b59c76698770b74692815Selim Gurun do { 10829df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->parent; 10830df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) 10831df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 10832df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == node) { 10833df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = NULL; 10834df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 10835df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10836df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->next != NULL) { 10837df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->next; 10838df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 10839df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10840df143a5041f03a22808b59c76698770b74692815Selim Gurun } while (cur != NULL); 10841df143a5041f03a22808b59c76698770b74692815Selim Gurun } 10842df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 10843df143a5041f03a22808b59c76698770b74692815Selim Gurun} 10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation interfaces * 10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidCtxt: 10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a precompiled XML RelaxNGs 10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs validation context based on the given schema 10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error 10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidCtxtPtr 10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) 10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidCtxtPtr ret; 10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt)); 10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRngVErrMemory(NULL, "building context\n"); 10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRelaxNGValidCtxt)); 10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->schema = schema; 10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = xmlGenericError; 10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->userData = xmlGenericErrorContext; 10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errNr = 0; 10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errMax = 0; 10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->err = NULL; 10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errTab = NULL; 10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema != NULL) 10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->idref = schema->idref; 10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->states = NULL; 10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->freeState = NULL; 10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->freeStates = NULL; 10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->errNo = XML_RELAXNG_OK; 10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidCtxt: 10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context 10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context 10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) 10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int k; 10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) 10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(NULL, ctxt->states); 10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeState != NULL) { 10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->freeState->nbState; k++) { 10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]); 10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(NULL, ctxt->freeState); 10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeStates != NULL) { 10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (k = 0; k < ctxt->freeStatesNr; k++) { 10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]); 10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->freeStates); 10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errTab != NULL) 10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->errTab); 10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->elemTab != NULL) { 10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRelaxNGElemPop(ctxt); 10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (exec != NULL) { 10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRelaxNGElemPop(ctxt); 10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->elemTab); 10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidErrors: 10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error function 10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function 10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context 10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the error and warning callback informations 10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, 10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc err, 10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc warn, void *ctx) 10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = err; 10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = warn; 10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = NULL; 10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidStructuredErrors: 10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror: the structured error function 10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context 10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback 10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, 10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror, void *ctx) 10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->serror = serror; 10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = NULL; 10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->warning = NULL; 10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctx; 10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetValidErrors: 10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error function result 10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function result 10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context result 10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the error and warning callback informations 10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error and 0 otherwise 10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, 10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityErrorFunc * err, 10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRelaxNGValidityWarningFunc * warn, void **ctx) 10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err != NULL) 10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *err = ctxt->error; 10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (warn != NULL) 10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *warn = ctxt->warning; 10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx != NULL) 10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctx = ctxt->userData; 10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDoc: 10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a Relax-NG validation context 10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a parsed document tree 11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a document tree in memory. 11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is valid, a positive error code 11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of internal or API error. 11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) 11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (doc == NULL)) 11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = doc; 11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRelaxNGValidateDocument(ctxt, doc); 11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11018df143a5041f03a22808b59c76698770b74692815Selim Gurun * Remove all left PSVI 11019df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 11020df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRelaxNGCleanPSVI((xmlNodePtr) doc); 11021df143a5041f03a22808b59c76698770b74692815Selim Gurun 11022df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: build error codes 11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) 11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_relaxng 11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */ 11033