1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valid.c : part of the code use to do the DTD handling and the validity 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * checking 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/list.h> 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int create); 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_VALID_ALGO */ 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_REGEXP_ALGO */ 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO \ 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef LIBXML_VALID_ENABLED 4060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 4160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, 4260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *value); 4360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Error handling routines * 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlVErrMemory: 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML validation parser context 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory error 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlVErrMemory(xmlValidCtxtPtr ctxt, const char *extra) 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr pctxt = NULL; 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use the special values to detect if it is part of a parsing 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context */ 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long delta = (char *) ctxt - (char *) ctxt->userData; 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((delta > 0) && (delta < 250)) 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = ctxt->userData; 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, channel, data, 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt, NULL, XML_FROM_VALID, XML_ERR_NO_MEMORY, 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, channel, data, 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt, NULL, XML_FROM_VALID, XML_ERR_NO_MEMORY, 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed\n"); 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrValid: 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML validation parser context 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrValid(xmlValidCtxtPtr ctxt, xmlParserErrors error, 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const char *extra) 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr pctxt = NULL; 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use the special values to detect if it is part of a parsing 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context */ 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long delta = (char *) ctxt - (char *) ctxt->userData; 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((delta > 0) && (delta < 250)) 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = ctxt->userData; 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, channel, data, 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt, NULL, XML_FROM_VALID, error, 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, extra, NULL, NULL, 0, 0, 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, extra); 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, channel, data, 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt, NULL, XML_FROM_VALID, error, 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, 12543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich "%s", msg); 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrValidNode: 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML validation parser context 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra informations 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra informations 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra informations 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error, provide contextual informations 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrValidNode(xmlValidCtxtPtr ctxt, 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, xmlParserErrors error, 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * str2, const xmlChar * str3) 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr pctxt = NULL; 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use the special values to detect if it is part of a parsing 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context */ 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long delta = (char *) ctxt - (char *) ctxt->userData; 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((delta > 0) && (delta < 250)) 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = ctxt->userData; 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str3, 0, 0, msg, str1, str2, str3); 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrValidNodeNr: 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML validation parser context 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra informations 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @int2: extra informations 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra informations 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error, provide contextual informations 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrValidNodeNr(xmlValidCtxtPtr ctxt, 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, xmlParserErrors error, 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int int2, const xmlChar * str3) 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr pctxt = NULL; 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use the special values to detect if it is part of a parsing 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context */ 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long delta = (char *) ctxt - (char *) ctxt->userData; 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((delta > 0) && (delta < 250)) 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = ctxt->userData; 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str3, 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, int2, 0, msg, str1, int2, str3); 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrValidWarning: 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML validation parser context 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node raising the error 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra information 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra information 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra information 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error, provide contextual information 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrValidWarning(xmlValidCtxtPtr ctxt, 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, xmlParserErrors error, 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * str2, const xmlChar * str3) 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr pctxt = NULL; 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->warning; 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use the special values to detect if it is part of a parsing 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context */ 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long delta = (char *) ctxt - (char *) ctxt->userData; 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((delta > 0) && (delta < 250)) 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = ctxt->userData; 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_WARNING, NULL, 0, 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str3, 0, 0, msg, str1, str2, str3); 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If regexp are enabled we can do continuous validation without the 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need of a tree to validate the content model. this is done in each 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * callbacks. 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Each xmlValidState represent the validation state associated to the 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * set of nodes currently open from the document root to the current element. 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlValidState { 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl; /* pointer to the content model */ 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* pointer to the current node */ 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; /* regexp runtime */ 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} _xmlValidState; 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvstateVPush(xmlValidCtxtPtr ctxt, xmlElementPtr elemDecl, xmlNodePtr node) { 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->vstateMax == 0) || (ctxt->vstateTab == NULL)) { 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax = 10; 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab = (xmlValidState *) xmlMalloc(ctxt->vstateMax * 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->vstateTab[0])); 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateTab == NULL) { 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr >= ctxt->vstateMax) { 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidState *tmp; 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "realloc failed"); 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax *= 2; 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab = tmp; 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = &ctxt->vstateTab[ctxt->vstateNr]; 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].elemDecl = elemDecl; 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].node = node; 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl != NULL) && (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT)) { 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl->contModel == NULL) 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidBuildContentModel(ctxt, elemDecl); 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl->contModel != NULL) { 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].exec = 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].exec = NULL; 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elemDecl, 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to build content model regexp for %s\n", 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node->name, NULL, NULL); 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->vstateNr++); 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvstateVPop(xmlValidCtxtPtr ctxt) { 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl; 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr < 1) return(-1); 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateNr--; 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = ctxt->vstateTab[ctxt->vstateNr].elemDecl; 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].elemDecl = NULL; 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].node = NULL; 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl != NULL) && (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT)) { 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(ctxt->vstateTab[ctxt->vstateNr].exec); 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].exec = NULL; 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr >= 1) 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = &ctxt->vstateTab[ctxt->vstateNr - 1]; 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = NULL; 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->vstateNr); 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* not LIBXML_REGEXP_ENABLED */ 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If regexp are not enabled, it uses a home made algorithm less 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * complex and easier to 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * debug/maintain than a generic NFA -> DFA state based algo. The 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only restriction is on the deepness of the tree limited by the 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * size of the occurs bitfield 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is the content of a saved state for rollbacks 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ROLLBACK_OR 0 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ROLLBACK_PARENT 1 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlValidState { 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr cont; /* pointer to the content model subtree */ 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* pointer to the current node in the list */ 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long occurs;/* bitfield for multiple occurrences */ 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char depth; /* current depth in the overall tree */ 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char state; /* ROLLBACK_XXX */ 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} _xmlValidState; 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_RECURSE 25000 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_DEPTH ((sizeof(_xmlValidState.occurs)) * 8) 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CONT ctxt->vstate->cont 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NODE ctxt->vstate->node 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEPTH ctxt->vstate->depth 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define OCCURS ctxt->vstate->occurs 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define STATE ctxt->vstate->state 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define OCCURRENCE (ctxt->vstate->occurs & (1 << DEPTH)) 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PARENT_OCCURRENCE (ctxt->vstate->occurs & ((1 << DEPTH) - 1)) 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SET_OCCURRENCE ctxt->vstate->occurs |= (1 << DEPTH) 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define RESET_OCCURRENCE ctxt->vstate->occurs &= ((1 << DEPTH) - 1) 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont, 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, unsigned char depth, long occurs, 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char state) { 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = ctxt->vstateNr - 1; 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr > MAX_RECURSE) { 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateTab == NULL) { 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax = 8; 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab = (xmlValidState *) xmlMalloc( 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateTab == NULL) { 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr >= ctxt->vstateMax) { 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidState *tmp; 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax *= 2; 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab = tmp; 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = &ctxt->vstateTab[0]; 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't push on the stack a state already here 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((i >= 0) && (ctxt->vstateTab[i].cont == cont) && 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->vstateTab[i].node == node) && 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->vstateTab[i].depth == depth) && 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->vstateTab[i].occurs == occurs) && 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->vstateTab[i].state == state)) 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->vstateNr); 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].cont = cont; 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].node = node; 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].depth = depth; 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].occurs = occurs; 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab[ctxt->vstateNr].state = state; 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->vstateNr++); 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvstateVPop(xmlValidCtxtPtr ctxt) { 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr <= 1) return(-1); 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateNr--; 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = &ctxt->vstateTab[0]; 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate->cont = ctxt->vstateTab[ctxt->vstateNr].cont; 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate->node = ctxt->vstateTab[ctxt->vstateNr].node; 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate->depth = ctxt->vstateTab[ctxt->vstateNr].depth; 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate->occurs = ctxt->vstateTab[ctxt->vstateNr].occurs; 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate->state = ctxt->vstateTab[ctxt->vstateNr].state; 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->vstateNr); 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectnodeVPush(xmlValidCtxtPtr ctxt, xmlNodePtr value) 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeMax <= 0) { 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 4; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr *) xmlMalloc(ctxt->nodeMax * 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->nodeTab[0])); 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab == NULL) { 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeNr >= ctxt->nodeMax) { 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *tmp; 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax * 2 * sizeof(ctxt->nodeTab[0])); 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "realloc failed"); 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax *= 2; 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = tmp; 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab[ctxt->nodeNr] = value; 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = value; 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->nodeNr++); 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectnodeVPop(xmlValidCtxtPtr ctxt) 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ret; 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeNr <= 0) 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr--; 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeNr > 0) 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = ctxt->nodeTab[ctxt->nodeNr - 1]; 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->nodeTab[ctxt->nodeNr]; 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab[ctxt->nodeNr] = NULL; 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_VALID_ALGO 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidPrintNode(xmlNodePtr cur) { 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "null"); 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s ", cur->name); 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "text "); 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "cdata "); 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "&%s; ", cur->name); 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "pi(%s) ", cur->name); 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "comment "); 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?attr? "); 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?ent? "); 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?doc? "); 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?doctype? "); 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?frag? "); 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?nota? "); 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?html? "); 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?docb? "); 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?dtd? "); 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?edecl? "); 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?adecl? "); 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?entdecl? "); 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "?nsdecl? "); 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "incstart "); 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "incend "); 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidPrintNodeList(xmlNodePtr cur) { 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "null "); 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidPrintNode(cur); 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidDebug(xmlNodePtr cur, xmlElementContentPtr cont) { 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char expr[5000]; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expr[0] = 0; 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "valid: "); 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidPrintNodeList(cur); 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "against "); 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(expr, 5000, cont, 1); 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s\n", expr); 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidDebugState(xmlValidStatePtr state) { 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "("); 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->cont == NULL) 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "null,"); 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (state->cont->type) { 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "pcdata,"); 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s,", 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->cont->name); 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "seq,"); 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "or,"); 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidPrintNode(state->node); 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, ",%d,%X,%d)", 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->depth, state->occurs, state->state); 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidStateDebug(xmlValidCtxtPtr ctxt) { 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "state: "); 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidDebugState(ctxt->vstate); 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " stack: %d ", 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateNr - 1); 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0, j = ctxt->vstateNr - 1;(i < 3) && (j > 0);i++,j--) 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidDebugState(&ctxt->vstateTab[j]); 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "\n"); 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/***** 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID_STATE(n,c) xmlValidDebug(n,c); 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *****/ 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID_STATE(n,c) xmlValidStateDebug(ctxt); 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID_MSG(m) \ 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s\n", m); 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID_STATE(n,c) 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID_MSG(m) 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* TODO: use hash table for accesses to elem and attribute definitions */ 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_DTD \ 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(0); \ 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((doc->intSubset == NULL) && \ 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (doc->extSubset == NULL)) return(0) 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Content model validation based on the regexps * 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidBuildAContentModel: 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the content model 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the element name whose content is being built 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generate the automata sequence needed for that type 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if successful or 0 in case of error. 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidBuildAContentModel(xmlElementContentPtr content, 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidCtxtPtr ctxt, 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name) { 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, NULL, XML_ERR_INTERNAL_ERROR, 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found NULL content in content model of %s\n", 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL, NULL); 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (content->type) { 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, NULL, XML_ERR_INTERNAL_ERROR, 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Found PCDATA in content model of %s\n", 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL, NULL); 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: { 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate = ctxt->state; 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(content->name, content->prefix, fn, 50); 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) { 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "Building content model"); 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (content->ocur) { 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewTransition(ctxt->am, 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL, fullname, NULL); 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewTransition(ctxt->am, 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL, fullname, NULL); 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewTransition(ctxt->am, 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL, fullname, NULL); 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewTransition(ctxt->am, ctxt->state, 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, fullname, NULL); 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewEpsilon(ctxt->am, 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL); 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewTransition(ctxt->am, 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, ctxt->state, fullname, NULL); 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != content->name)) 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: { 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate, oldend; 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentOccur ocur; 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simply iterate over the content 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ocur = content->ocur; 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ocur != XML_ELEMENT_CONTENT_ONCE) { 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidBuildAContentModel(content->c1, ctxt, name); 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->c2; 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((content->type == XML_ELEMENT_CONTENT_SEQ) && 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->ocur == XML_ELEMENT_CONTENT_ONCE)); 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidBuildAContentModel(content, ctxt, name); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldend = ctxt->state; 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldend, NULL); 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ocur) { 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: { 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr oldstate, oldend; 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentOccur ocur; 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ocur = content->ocur; 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ocur == XML_ELEMENT_CONTENT_PLUS) || 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ocur == XML_ELEMENT_CONTENT_MULT)) { 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewEpsilon(ctxt->am, 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state, NULL); 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldstate = ctxt->state; 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldend = xmlAutomataNewState(ctxt->am); 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * iterate over the subtypes and remerge the end with an 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * epsilon transition 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidBuildAContentModel(content->c1, ctxt, name); 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldend); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = content->c2; 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((content->type == XML_ELEMENT_CONTENT_OR) && 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->ocur == XML_ELEMENT_CONTENT_ONCE)); 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = oldstate; 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidBuildAContentModel(content, ctxt, name); 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldend); 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldend, NULL); 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ocur) { 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ContentModel broken for element %s\n", 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) name); 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidBuildContentModel: 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a validation context 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element declaration node 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Re)Build the automata associated to the content model of this 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 in case of success, 0 in case of error 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) { 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (elem == NULL)) 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->type != XML_ELEMENT_DECL) 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->etype != XML_ELEMENT_TYPE_ELEMENT) 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: should we rebuild in this case ? */ 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->contModel != NULL) { 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlRegexpIsDeterminist(elem->contModel)) { 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = xmlNewAutomata(); 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->am == NULL) { 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Cannot create automata for element %s\n", 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = xmlAutomataGetInitState(ctxt->am); 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidBuildAContentModel(elem->content, ctxt, elem->name); 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataSetFinalState(ctxt->am, ctxt->state); 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->contModel = xmlAutomataCompile(ctxt->am); 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegexpIsDeterminist(elem->contModel) != 1) { 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char expr[5000]; 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expr[0] = 0; 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(expr, 5000, elem->content, 1); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_CONTENT_NOT_DETERMINIST, 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Content model of %s is not determinist: %s\n", 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, BAD_CAST expr, NULL); 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_ALGO 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPrint(stderr, elem->contModel); 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt->am); 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = NULL; 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = NULL; 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt->am); 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->am = NULL; 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**************************************************************** 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Util functions for data allocation/deallocation * 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ****************************************************************/ 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewValidCtxt: 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a validation context structure. 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the new validation context structure 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidCtxtPtr xmlNewValidCtxt(void) { 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidCtxtPtr ret; 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret = xmlMalloc(sizeof (xmlValidCtxt))) == NULL) { 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void) memset(ret, 0, sizeof (xmlValidCtxt)); 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeValidCtxt: 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the validation context to free 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a validation context structure. 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeValidCtxt(xmlValidCtxtPtr cur) { 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->vstateTab != NULL) 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur->vstateTab); 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab != NULL) 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur->nodeTab); 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewDocElementContent: 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the subelement name or NULL 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of element content decl 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate an element content structure for the document. 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the new element content structure 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementContentPtr 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewDocElementContent(xmlDocPtr doc, const xmlChar *name, 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentType type) { 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr ret; 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = doc->dict; 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(type) { 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewElementContent : name == NULL !\n", 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewElementContent : name != NULL !\n", 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ELEMENT content corrupted invalid type\n", 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlElementContent)); 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ocur = XML_ELEMENT_CONTENT_ONCE; 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int l; 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlSplitQName3(name, &l); 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict == NULL) 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(name); 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlDictLookup(dict, name, -1); 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict == NULL) { 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = xmlStrndup(name, l); 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(tmp); 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = xmlDictLookup(dict, name, l); 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlDictLookup(dict, tmp, -1); 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewElementContent: 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the subelement name or NULL 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of element content decl 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate an element content structure. 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deprecated in favor of xmlNewDocElementContent 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the new element content structure 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementContentPtr 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewElementContent(const xmlChar *name, xmlElementContentType type) { 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlNewDocElementContent(NULL, name, type)); 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyDocElementContent: 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document owning the element declaration 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: An element content pointer. 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an element content description. 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlElementContentPtr or NULL in case of error. 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementContentPtr 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) { 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr ret = NULL, prev = NULL, tmp; 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL); 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = doc->dict; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlElementContent)); 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = cur->type; 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ocur = cur->ocur; 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->name != NULL) { 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlDictLookup(dict, cur->name, -1); 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(cur->name); 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->prefix != NULL) { 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = xmlDictLookup(dict, cur->prefix, -1); 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = xmlStrdup(cur->prefix); 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->c1 != NULL) 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->c1 = xmlCopyDocElementContent(doc, cur->c1); 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->c1 != NULL) 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->c1->parent = ret; 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->c2 != NULL) { 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = ret; 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->c2; 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(tmp, 0, sizeof(xmlElementContent)); 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->type = cur->type; 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->ocur = cur->ocur; 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->c2 = tmp; 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->name != NULL) { 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->name = xmlDictLookup(dict, cur->name, -1); 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->name = xmlStrdup(cur->name); 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->prefix != NULL) { 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->prefix = xmlDictLookup(dict, cur->prefix, -1); 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->prefix = xmlStrdup(cur->prefix); 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->c1 != NULL) 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->c1 = xmlCopyDocElementContent(doc,cur->c1); 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->c1 != NULL) 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->c1->parent = ret; 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = tmp; 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->c2; 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyElementContent: 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: An element content pointer. 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an element content description. 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deprecated, use xmlCopyDocElementContent instead 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlElementContentPtr or NULL in case of error. 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementContentPtr 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyElementContent(xmlElementContentPtr cur) { 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlCopyDocElementContent(NULL, cur)); 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeDocElementContent: 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document owning the element declaration 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the element content tree to free 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an element content structure. The whole subtree is removed. 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) { 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr next; 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = doc->dict; 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = cur->c2; 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ELEMENT content corrupted invalid type\n", 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->c1 != NULL) xmlFreeDocElementContent(doc, cur->c1); 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) { 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name))) 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) cur->name); 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prefix != NULL) && (!xmlDictOwns(dict, cur->prefix))) 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) cur->prefix); 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->name != NULL) xmlFree((xmlChar *) cur->name); 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->prefix != NULL) xmlFree((xmlChar *) cur->prefix); 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next; 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeElementContent: 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the element content tree to free 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an element content structure. The whole subtree is removed. 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deprecated, use xmlFreeDocElementContent instead 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeElementContent(xmlElementContentPtr cur) { 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDocElementContent(NULL, cur); 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpElementContent: 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: An XML buffer 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: An element table 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @glob: 1 if one must print the englobing parenthesis, 0 otherwise 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the element table as an XML DTD definition 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) { 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) return; 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) xmlBufferWriteChar(buf, "("); 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (content->type) { 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "#PCDATA"); 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content->prefix != NULL) { 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, content->prefix); 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ":"); 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, content->name); 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c1, 1); 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c1, 0); 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " , "); 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content->c2->type == XML_ELEMENT_CONTENT_OR) || 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c2, 1); 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c2, 0); 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c1, 1); 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c1, 0); 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " | "); 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((content->c2->type == XML_ELEMENT_CONTENT_OR) && 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c2, 1); 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, content->c2, 0); 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ELEMENT content corrupted invalid type\n", 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ")"); 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (content->ocur) { 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "?"); 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "*"); 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "+"); 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSprintfElementContent: 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: an output buffer 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: An element table 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @englob: 1 if one must print the englobing parenthesis, 0 otherwise 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deprecated, unsafe, use xmlSnprintfElementContent 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSprintfElementContent(char *buf ATTRIBUTE_UNUSED, 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr content ATTRIBUTE_UNUSED, 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int englob ATTRIBUTE_UNUSED) { 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSnprintfElementContent: 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: an output buffer 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the buffer size 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: An element table 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @englob: 1 if one must print the englobing parenthesis, 0 otherwise 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the element content definition 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Intended just for the debug routine 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob) { 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) return; 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = strlen(buf); 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < 50) { 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size - len > 4) && (buf[len - 1] != '.')) 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (englob) strcat(buf, "("); 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (content->type) { 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, "#PCDATA"); 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content->prefix != NULL) { 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < xmlStrlen(content->prefix) + 10) { 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, (char *) content->prefix); 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, ":"); 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < xmlStrlen(content->name) + 10) { 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content->name != NULL) 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, (char *) content->name); 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c1, 1); 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c1, 0); 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = strlen(buf); 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < 50) { 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size - len > 4) && (buf[len - 1] != '.')) 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " , "); 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((content->c2->type == XML_ELEMENT_CONTENT_OR) || 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) && 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c2->type != XML_ELEMENT_CONTENT_ELEMENT)) 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c2, 1); 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c2, 0); 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c1, 1); 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c1, 0); 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = strlen(buf); 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < 50) { 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size - len > 4) && (buf[len - 1] != '.')) 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " | "); 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) && 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (content->c2->type != XML_ELEMENT_CONTENT_ELEMENT)) 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c2, 1); 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(buf, size, content->c2, 0); 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (englob) 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, ")"); 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (content->ocur) { 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, "?"); 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, "*"); 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, "+"); 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**************************************************************** 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registration of DTD declarations * 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ****************************************************************/ 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeElement: 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: An element 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an element definition 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeElement(xmlElementPtr elem) { 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return; 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode((xmlNodePtr) elem); 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDocElementContent(elem->doc, elem->content); 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->name != NULL) 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) elem->name); 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->prefix != NULL) 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) elem->prefix); 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->contModel != NULL) 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRegexp(elem->contModel); 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(elem); 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddElementDecl: 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: pointer to the DTD 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the element type 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the element content tree or NULL 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new element declaration 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the entity 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementPtr 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddElementDecl(xmlValidCtxtPtr ctxt, 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd, const xmlChar *name, 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementTypeVal type, 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr content) { 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr ret; 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementTablePtr table; 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr oldAttributes = NULL; 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ns, *uqname; 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) { 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_EMPTY: 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) { 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddElementDecl: content != NULL for EMPTY\n", 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ANY: 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) { 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddElementDecl: content != NULL for ANY\n", 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_MIXED: 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddElementDecl: content == NULL for MIXED\n", 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ELEMENT: 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content == NULL) { 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddElementDecl: content == NULL for ELEMENT\n", 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ELEMENT decl corrupted invalid type\n", 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check if name is a QName 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uqname = xmlSplitQName2(name, &ns); 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = uqname; 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the Element table if needed. 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlElementTablePtr) dtd->elements; 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->doc != NULL) 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = dtd->doc->dict; 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = xmlHashCreateDict(0, dict); 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->elements = (void *) table; 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddElementDecl: Table creation failed!\n"); 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uqname); 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * lookup old attributes inserted on an undefined element in the 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal subset. 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd->doc != NULL) && (dtd->doc->intSubset != NULL)) { 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlHashLookup2(dtd->doc->intSubset->elements, name, ns); 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != NULL) && (ret->etype == XML_ELEMENT_TYPE_UNDEFINED)) { 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldAttributes = ret->attributes; 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attributes = NULL; 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashRemoveEntry2(dtd->doc->intSubset->elements, name, ns, NULL); 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeElement(ret); 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The element may already be present if one of its attribute 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * was registered first 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlHashLookup2(table, name, ns); 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->etype != XML_ELEMENT_TYPE_UNDEFINED) { 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The element is already defined in this DTD. 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ELEM_REDEFINED, 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Redefinition of element %s\n", 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL, NULL); 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uqname); 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = NULL; 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uqname); 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlElement)); 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_ELEMENT_DECL; 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(name); 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->name == NULL) { 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uqname); 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = ns; 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validity Check: 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Insertion must not fail 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry2(table, name, ns, ret)) { 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The element is already defined in this DTD. 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ELEM_REDEFINED, 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Redefinition of element %s\n", 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL, NULL); 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeElement(ret); 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uqname); 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For new element, may have attributes from earlier 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * definition in internal subset 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attributes = oldAttributes; 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finish to fill the structure. 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->etype = type; 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Avoid a stupid copy when called by the parser 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and flag it by setting a special parent value 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so the parser doesn't unallocate it. 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1))) { 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = content; 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content->parent = (xmlElementContentPtr) 1; 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = xmlCopyDocElementContent(dtd->doc, content); 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link it to the DTD 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = dtd; 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = dtd->doc; 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->last == NULL) { 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->children = dtd->last = (xmlNodePtr) ret; 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last->next = (xmlNodePtr) ret; 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prev = dtd->last; 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last = (xmlNodePtr) ret; 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uqname); 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeElementTable: 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An element table 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an element hash table. 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeElementTable(xmlElementTablePtr table) { 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(table, (xmlHashDeallocator) xmlFreeElement); 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_TREE_ENABLED 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyElement: 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: An element 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an element. 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlElementPtr or NULL in case of error. 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlElementPtr 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyElement(xmlElementPtr elem) { 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr cur; 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlElement)); 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_ELEMENT_DECL; 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->etype = elem->etype; 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->name != NULL) 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = xmlStrdup(elem->name); 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = NULL; 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->prefix != NULL) 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prefix = xmlStrdup(elem->prefix); 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prefix = NULL; 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = xmlCopyElementContent(elem->content); 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO : rebuild the attribute list on the copy */ 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->attributes = NULL; 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyElementTable: 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An element table 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an element table. 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlElementTablePtr or NULL in case of error. 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementTablePtr 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyElementTable(xmlElementTablePtr table) { 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlElementTablePtr) xmlHashCopy(table, 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashCopier) xmlCopyElement)); 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_TREE_ENABLED */ 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpElementDecl: 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: An element table 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the element declaration as an XML 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DTD definition 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpElementDecl(xmlBufferPtr buf, xmlElementPtr elem) { 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (elem == NULL)) 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (elem->etype) { 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_EMPTY: 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ELEMENT "); 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->prefix != NULL) { 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->prefix); 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ":"); 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->name); 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " EMPTY>\n"); 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ANY: 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ELEMENT "); 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->prefix != NULL) { 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->prefix); 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ":"); 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->name); 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " ANY>\n"); 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_MIXED: 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ELEMENT "); 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->prefix != NULL) { 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->prefix); 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ":"); 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->name); 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, elem->content, 1); 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ELEMENT: 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ELEMENT "); 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->prefix != NULL) { 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->prefix); 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ":"); 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, elem->name); 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementContent(buf, elem->content, 1); 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ELEMENT struct corrupted invalid type\n", 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpElementDeclScan: 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: An element table 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine is used by the hash scan function. It just reverses 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the arguments. 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpElementDeclScan(xmlElementPtr elem, xmlBufferPtr buf) { 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpElementDecl(buf, elem); 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpElementTable: 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An element table 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the element table as an XML DTD definition 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpElementTable(xmlBufferPtr buf, xmlElementTablePtr table) { 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (table == NULL)) 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner) xmlDumpElementDeclScan, buf); 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCreateEnumeration: 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the enumeration name or NULL 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create and initialize an enumeration attribute node. 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlEnumerationPtr just created or NULL in case 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of error. 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEnumerationPtr 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCreateEnumeration(const xmlChar *name) { 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr ret; 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlEnumerationPtr) xmlMalloc(sizeof(xmlEnumeration)); 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlEnumeration)); 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(name); 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeEnumeration: 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the tree to free. 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * free an enumeration attribute node (recursive). 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeEnumeration(xmlEnumerationPtr cur) { 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return; 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) xmlFreeEnumeration(cur->next); 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->name != NULL) xmlFree((xmlChar *) cur->name); 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_TREE_ENABLED 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyEnumeration: 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the tree to copy. 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy an enumeration attribute node (recursive). 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlEnumerationPtr just created or NULL in case 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of error. 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEnumerationPtr 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyEnumeration(xmlEnumerationPtr cur) { 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr ret; 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL); 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlCreateEnumeration((xmlChar *) cur->name); 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) ret->next = xmlCopyEnumeration(cur->next); 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else ret->next = NULL; 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_TREE_ENABLED */ 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpEnumeration: 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enum: An enumeration 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the enumeration 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpEnumeration(xmlBufferPtr buf, xmlEnumerationPtr cur) { 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (cur == NULL)) 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, cur->name); 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next == NULL) 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ")"); 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " | "); 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpEnumeration(buf, cur->next); 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlScanIDAttributeDecl: 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element name 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: whether to raise errors here 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Verify that the element don't have too many ID attributes 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declared. 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of ID attributes found. 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlScanIDAttributeDecl(xmlValidCtxtPtr ctxt, xmlElementPtr elem, int err) { 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr cur; 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(0); 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = elem->attributes; 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->atype == XML_ATTRIBUTE_ID) { 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret ++; 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret > 1) && (err)) 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_MULTIPLE_ID, 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has too many ID attributes defined : %s\n", 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, cur->name, NULL); 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->nexth; 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeAttribute: 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: An attribute 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an attribute definition 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeAttribute(xmlAttributePtr attr) { 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) return; 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->doc != NULL) 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = attr->doc->dict; 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = NULL; 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUnlinkNode((xmlNodePtr) attr); 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->tree != NULL) 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEnumeration(attr->tree); 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) { 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->elem != NULL) && (!xmlDictOwns(dict, attr->elem))) 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->elem); 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->name != NULL) && (!xmlDictOwns(dict, attr->name))) 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->name); 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->prefix != NULL) && (!xmlDictOwns(dict, attr->prefix))) 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->prefix); 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->defaultValue != NULL) && 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlDictOwns(dict, attr->defaultValue))) 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->defaultValue); 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->elem != NULL) 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->elem); 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->name != NULL) 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->name); 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->defaultValue != NULL) 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->defaultValue); 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->prefix != NULL) 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) attr->prefix); 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(attr); 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddAttributeDecl: 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: pointer to the DTD 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element name 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the attribute name 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the attribute namespace prefix 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the attribute type 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def: the attribute default type 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defaultValue: the attribute default value 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tree: if it's an enumeration, the associated list 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new attribute declaration 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @tree becomes the ownership of the DTD 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not new, otherwise the attribute decl 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAttributePtr 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddAttributeDecl(xmlValidCtxtPtr ctxt, 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd, const xmlChar *elem, 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *ns, 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributeType type, xmlAttributeDefault def, 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *defaultValue, xmlEnumerationPtr tree) { 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr ret; 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributeTablePtr table; 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDef; 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) { 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEnumeration(tree); 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEnumeration(tree); 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) { 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEnumeration(tree); 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->doc != NULL) 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = dtd->doc->dict; 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the type and possibly the default value. 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_CDATA: 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ID: 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREF: 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREFS: 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITY: 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITIES: 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKEN: 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKENS: 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENUMERATION: 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NOTATION: 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ATTRIBUTE struct corrupted invalid type\n", 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEnumeration(tree); 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((defaultValue != NULL) && 198360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (!xmlValidateAttributeValueInternal(dtd->doc, type, defaultValue))) { 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_DEFAULT, 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s of %s: invalid default value\n", 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem, name, defaultValue); 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project defaultValue = NULL; 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check first that an attribute defined in the external subset wasn't 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * already defined in the internal subset 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd->doc != NULL) && (dtd->doc->extSubset == dtd) && 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (dtd->doc->intSubset != NULL) && 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (dtd->doc->intSubset->attributes != NULL)) { 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlHashLookup3(dtd->doc->intSubset->attributes, name, ns, elem); 200160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret != NULL) { 200260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeEnumeration(tree); 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 200460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the Attribute table if needed. 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlAttributeTablePtr) dtd->attributes; 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = xmlHashCreateDict(0, dict); 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->attributes = (void *) table; 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddAttributeDecl: Table creation failed!\n"); 201860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeEnumeration(tree); 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 202660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeEnumeration(tree); 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlAttribute)); 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_ATTRIBUTE_DECL; 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->atype = type; 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doc must be set before possible error causes call 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to xmlFreeAttribute (because it's used to check on 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * dict use) 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = dtd->doc; 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) { 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlDictLookup(dict, name, -1); 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = xmlDictLookup(dict, ns, -1); 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->elem = xmlDictLookup(dict, elem, -1); 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(name); 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prefix = xmlStrdup(ns); 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->elem = xmlStrdup(elem); 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->def = def; 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->tree = tree; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (defaultValue != NULL) { 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict) 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->defaultValue = xmlDictLookup(dict, defaultValue, -1); 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->defaultValue = xmlStrdup(defaultValue); 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validity Check: 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for previous declarations of the ATTLIST 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry3(table, ret->name, ret->prefix, ret->elem, ret) < 0) { 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The attribute is already defined in this DTD. 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidWarning(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_REDEFINED, 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s of element %s: already defined\n", 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, elem, NULL); 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAttribute(ret); 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validity Check: 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Multiple ID per element 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDef = xmlGetDtdElementDesc2(dtd, elem, 1); 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDef != NULL) { 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type == XML_ATTRIBUTE_ID) && 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlScanIDAttributeDecl(NULL, elemDef, 1) != 0)) { 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_MULTIPLE_ID, 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has too may ID attributes defined : %s\n", 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem, name, NULL); 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Insert namespace default def first they need to be 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processed first. 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(ret->name, BAD_CAST "xmlns")) || 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ret->prefix != NULL && 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ret->prefix, BAD_CAST "xmlns"))))) { 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nexth = elemDef->attributes; 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDef->attributes = ret; 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr tmp = elemDef->attributes; 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((tmp != NULL) && 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(tmp->name, BAD_CAST "xmlns")) || 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ret->prefix != NULL && 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ret->prefix, BAD_CAST "xmlns")))))) { 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->nexth == NULL) 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->nexth; 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nexth = tmp->nexth; 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->nexth = ret; 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nexth = elemDef->attributes; 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDef->attributes = ret; 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link it to the DTD 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = dtd; 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->last == NULL) { 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->children = dtd->last = (xmlNodePtr) ret; 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last->next = (xmlNodePtr) ret; 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prev = dtd->last; 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last = (xmlNodePtr) ret; 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeAttributeTable: 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An attribute table 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an entities hash table. 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeAttributeTable(xmlAttributeTablePtr table) { 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(table, (xmlHashDeallocator) xmlFreeAttribute); 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_TREE_ENABLED 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyAttribute: 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: An attribute 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an attribute. 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlAttributePtr or NULL in case of error. 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlAttributePtr 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyAttribute(xmlAttributePtr attr) { 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr cur; 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlAttribute)); 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_ATTRIBUTE_DECL; 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->atype = attr->atype; 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->def = attr->def; 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->tree = xmlCopyEnumeration(attr->tree); 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->elem != NULL) 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->elem = xmlStrdup(attr->elem); 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->name != NULL) 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = xmlStrdup(attr->name); 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->prefix != NULL) 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prefix = xmlStrdup(attr->prefix); 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->defaultValue != NULL) 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->defaultValue = xmlStrdup(attr->defaultValue); 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyAttributeTable: 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An attribute table 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an attribute table. 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlAttributeTablePtr or NULL in case of error. 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAttributeTablePtr 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyAttributeTable(xmlAttributeTablePtr table) { 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlAttributeTablePtr) xmlHashCopy(table, 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashCopier) xmlCopyAttribute)); 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_TREE_ENABLED */ 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpAttributeDecl: 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: An attribute declaration 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the attribute declaration as an XML 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DTD definition 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpAttributeDecl(xmlBufferPtr buf, xmlAttributePtr attr) { 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (attr == NULL)) 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ATTLIST "); 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, attr->elem); 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->prefix != NULL) { 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, attr->prefix); 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ":"); 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, attr->name); 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (attr->atype) { 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_CDATA: 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " CDATA"); 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ID: 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " ID"); 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREF: 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " IDREF"); 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREFS: 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " IDREFS"); 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITY: 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " ENTITY"); 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITIES: 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " ENTITIES"); 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKEN: 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " NMTOKEN"); 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKENS: 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " NMTOKENS"); 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENUMERATION: 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " ("); 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpEnumeration(buf, attr->tree); 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NOTATION: 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " NOTATION ("); 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpEnumeration(buf, attr->tree); 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ATTRIBUTE struct corrupted invalid type\n", 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (attr->def) { 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NONE: 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_REQUIRED: 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " #REQUIRED"); 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IMPLIED: 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " #IMPLIED"); 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_FIXED: 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " #FIXED"); 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: ATTRIBUTE struct corrupted invalid def\n", 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->defaultValue != NULL) { 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, attr->defaultValue); 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpAttributeDeclScan: 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: An attribute declaration 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is used with the hash scan function - just reverses arguments 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpAttributeDeclScan(xmlAttributePtr attr, xmlBufferPtr buf) { 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpAttributeDecl(buf, attr); 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpAttributeTable: 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An attribute table 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the attribute table as an XML DTD definition 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpAttributeTable(xmlBufferPtr buf, xmlAttributeTablePtr table) { 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (table == NULL)) 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner) xmlDumpAttributeDeclScan, buf); 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTATIONs * 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeNotation: 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @not: A notation 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an notation definition 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeNotation(xmlNotationPtr nota) { 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota == NULL) return; 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->name != NULL) 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) nota->name); 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->PublicID != NULL) 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) nota->PublicID); 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->SystemID != NULL) 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) nota->SystemID); 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(nota); 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddNotationDecl: 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: pointer to the DTD 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @PublicID: the public identifier or NULL 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @SystemID: the system identifier or NULL 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new notation declaration 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the entity 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNotationPtr 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddNotationDecl(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *PublicID, const xmlChar *SystemID) { 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr ret; 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationTablePtr table; 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) { 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((PublicID == NULL) && (SystemID == NULL)) { 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the Notation table if needed. 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlNotationTablePtr) dtd->notations; 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->doc != NULL) 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = dtd->doc->dict; 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->notations = table = xmlHashCreateDict(0, dict); 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddNotationDecl: Table creation failed!\n"); 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlNotationPtr) xmlMalloc(sizeof(xmlNotation)); 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlNotation)); 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(name); 2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (SystemID != NULL) 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->SystemID = xmlStrdup(SystemID); 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (PublicID != NULL) 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->PublicID = xmlStrdup(PublicID); 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validity Check: 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the DTD for previous declarations of the ATTLIST 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(table, name, ret)) { 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_DTD_NOTATION_REDEFINED, 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddNotationDecl: %s already defined\n", 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) name); 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNotation(ret); 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeNotationTable: 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An notation table 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an entities hash table. 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeNotationTable(xmlNotationTablePtr table) { 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(table, (xmlHashDeallocator) xmlFreeNotation); 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_TREE_ENABLED 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyNotation: 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nota: A notation 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of a notation. 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlNotationPtr or NULL in case of error. 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNotationPtr 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyNotation(xmlNotationPtr nota) { 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr cur; 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlNotationPtr) xmlMalloc(sizeof(xmlNotation)); 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->name != NULL) 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = xmlStrdup(nota->name); 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = NULL; 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->PublicID != NULL) 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->PublicID = xmlStrdup(nota->PublicID); 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->PublicID = NULL; 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->SystemID != NULL) 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->SystemID = xmlStrdup(nota->SystemID); 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->SystemID = NULL; 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyNotationTable: 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: A notation table 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of a notation table. 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlNotationTablePtr or NULL in case of error. 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNotationTablePtr 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyNotationTable(xmlNotationTablePtr table) { 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNotationTablePtr) xmlHashCopy(table, 2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashCopier) xmlCopyNotation)); 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_TREE_ENABLED */ 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpNotationDecl: 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nota: A notation declaration 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content the notation declaration as an XML DTD definition 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpNotationDecl(xmlBufferPtr buf, xmlNotationPtr nota) { 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (nota == NULL)) 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!NOTATION "); 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, nota->name); 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->PublicID != NULL) { 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " PUBLIC "); 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, nota->PublicID); 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota->SystemID != NULL) { 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, nota->SystemID); 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " SYSTEM "); 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, nota->SystemID); 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " >\n"); 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpNotationDeclScan: 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nota: A notation declaration 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is called with the hash scan function, and just reverses args 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpNotationDeclScan(xmlNotationPtr nota, xmlBufferPtr buf) { 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpNotationDecl(buf, nota); 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpNotationTable: 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the XML buffer output 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: A notation table 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the notation table as an XML DTD definition 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpNotationTable(xmlBufferPtr buf, xmlNotationTablePtr table) { 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (table == NULL)) 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner) xmlDumpNotationDeclScan, buf); 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * IDs * 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DICT_FREE: 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: a string 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a string if it is not owned by the "dict" dictionnary in the 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * current scope 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DICT_FREE(str) \ 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((str) && ((!dict) || \ 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *)(str)); 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeID: 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @not: A id 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an id definition 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeID(xmlIDPtr id) { 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL) return; 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id->doc != NULL) 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = id->doc->dict; 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id->value != NULL) 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(id->value) 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id->name != NULL) 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(id->name) 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(id); 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddID: 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: pointer to the document 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value name 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the attribute holding the ID 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new id declaration 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the new xmlIDPtr 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIDPtr 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr) { 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlIDPtr ret; 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlIDTablePtr table; 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) { 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the ID table if needed. 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlIDTablePtr) doc->ids; 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->ids = table = xmlHashCreateDict(0, doc->dict); 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddID: Table creation failed!\n"); 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlIDPtr) xmlMalloc(sizeof(xmlID)); 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->value = xmlStrdup(value); 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->vstateNr != 0)) { 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Operating in streaming mode, attr is gonna disapear 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->dict != NULL) 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlDictLookup(doc->dict, attr->name, -1); 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(attr->name); 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attr = NULL; 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attr = attr; 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = NULL; 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->lineno = xmlGetLineNo(attr->parent); 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(table, value, ret) < 0) { 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The id is already defined in this DTD. 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->error != NULL)) { 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, attr->parent, XML_DTD_ID_REDEFINED, 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ID %s already defined\n", 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, NULL, NULL); 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeID(ret); 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr != NULL) 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->atype = XML_ATTRIBUTE_ID; 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeIDTable: 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An id table 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an ID hash table. 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeIDTable(xmlIDTablePtr table) { 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(table, (xmlHashDeallocator) xmlFreeID); 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsID: 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element carrying the attribute 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the attribute 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determine whether an attribute is of type ID. In case we have DTD(s) 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then this is done if DTD loading has been requested. In the case 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of HTML documents parsed with the HTML parser, then ID detection is 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * done systematically. 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the lookup result 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr == NULL) || (attr->name == NULL)) return(0); 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->ns != NULL) && (attr->ns->prefix != NULL) && 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!strcmp((char *) attr->name, "id")) && 2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!strcmp((char *) attr->ns->prefix, "xml"))) 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(0); 2682df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((doc->intSubset == NULL) && (doc->extSubset == NULL) && 2683df143a5041f03a22808b59c76698770b74692815Selim Gurun (doc->type != XML_HTML_DOCUMENT_NODE)) { 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(BAD_CAST "id", attr->name)) || 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(BAD_CAST "name", attr->name)) && 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((elem == NULL) || (xmlStrEqual(elem->name, BAD_CAST "a"))))) 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (elem == NULL) { 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attrDecl = NULL; 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar felem[50], fattr[50]; 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullelemname, *fullattrname; 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullelemname = (elem->ns != NULL && elem->ns->prefix != NULL) ? 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBuildQName(elem->name, elem->ns->prefix, felem, 50) : 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlChar *)elem->name; 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullattrname = (attr->ns != NULL && attr->ns->prefix != NULL) ? 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBuildQName(attr->name, attr->ns->prefix, fattr, 50) : 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlChar *)attr->name; 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullelemname != NULL && fullattrname != NULL) { 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullelemname, 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullattrname); 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullelemname, 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullattrname); 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullattrname != fattr) && (fullattrname != attr->name)) 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullattrname); 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullelemname != felem) && (fullelemname != elem->name)) 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullelemname); 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl != NULL) && (attrDecl->atype == XML_ATTRIBUTE_ID)) 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRemoveID: 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the attribute 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Remove the given attribute from the ID table maintained internally. 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if the lookup failed and 0 otherwise 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlIDTablePtr table; 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlIDPtr id; 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ID; 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(-1); 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) return(-1); 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlIDTablePtr) doc->ids; 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ID = xmlNodeListGetString(doc, attr->children, 1); 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ID == NULL) 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlHashLookup(table, ID); 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL || id->attr != attr) { 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ID); 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashRemoveEntry(table, ID, (xmlHashDeallocator) xmlFreeID); 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ID); 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->atype = 0; 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetID: 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: pointer to the document 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ID: the ID value 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the attribute declaring the given ID 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not found, otherwise the xmlAttrPtr defining the ID 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAttrPtr 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetID(xmlDocPtr doc, const xmlChar *ID) { 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlIDTablePtr table; 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlIDPtr id; 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ID == NULL) { 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlIDTablePtr) doc->ids; 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlHashLookup(table, ID); 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL) 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id->attr == NULL) { 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are operating on a stream, return a well known reference 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * since the attribute node doesn't exist anymore 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlAttrPtr) doc); 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(id->attr); 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Refs * 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct xmlRemoveMemo_t 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListPtr l; 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr ap; 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRemoveMemo; 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRemoveMemo *xmlRemoveMemoPtr; 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct xmlValidateMemo_t 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidCtxtPtr ctxt; 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlValidateMemo; 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlValidateMemo *xmlValidateMemoPtr; 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeRef: 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lk: A list link 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by a ref definition 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeRef(xmlLinkPtr lk) { 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRefPtr ref = (xmlRefPtr)xmlLinkGetData(lk); 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref == NULL) return; 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref->value != NULL) 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)ref->value); 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref->name != NULL) 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)ref->name); 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ref); 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeRefList: 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list_ref: A list of references. 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by a list of references 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeRefList(xmlListPtr list_ref) { 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list_ref == NULL) return; 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListDelete(list_ref); 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlWalkRemoveRef: 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: Contents of current link 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user: Value supplied by the user 2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 to abort the walk or 1 to continue 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlWalkRemoveRef(const void *data, const void *user) 2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr0 = ((xmlRefPtr)data)->attr; 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr1 = ((xmlRemoveMemoPtr)user)->ap; 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListPtr ref_list = ((xmlRemoveMemoPtr)user)->l; 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr0 == attr1) { /* Matched: remove and terminate walk */ 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListRemoveFirst(ref_list, (void *)data); 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0; 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 1; 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDummyCompare 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data0: Value supplied by the user 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data1: Value supplied by the user 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do nothing, return 0. Used to create unordered lists. 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDummyCompare(const void *data0 ATTRIBUTE_UNUSED, 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const void *data1 ATTRIBUTE_UNUSED) 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddRef: 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: pointer to the document 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value name 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the attribute holding the Ref 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new ref declaration 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the new xmlRefPtr 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRefPtr 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddRef(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr) { 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRefPtr ret; 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRefTablePtr table; 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListPtr ref_list; 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) { 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the Ref table if needed. 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlRefTablePtr) doc->refs; 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->refs = table = xmlHashCreateDict(0, doc->dict); 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddRef: Table creation failed!\n"); 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRefPtr) xmlMalloc(sizeof(xmlRef)); 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->value = xmlStrdup(value); 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->vstateNr != 0)) { 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Operating in streaming mode, attr is gonna disapear 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(attr->name); 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attr = NULL; 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = NULL; 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->attr = attr; 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->lineno = xmlGetLineNo(attr->parent); 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* To add a reference :- 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * References are maintained as a list of references, 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the entry, if no entry create new nodelist 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the owning node to the NodeList 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return the ref 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NULL == (ref_list = xmlHashLookup(table, value))) { 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NULL == (ref_list = xmlListCreate(xmlFreeRef, xmlDummyCompare))) { 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddRef: Reference list creation failed!\n", 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(table, value, ref_list) < 0) { 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListDelete(ref_list); 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddRef: Reference list insertion failed!\n", 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlListAppend(ref_list, ret) != 0) { 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddRef: Reference list insertion failed!\n", 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfailed: 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->value != NULL) 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *)ret->value); 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->name != NULL) 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *)ret->name); 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeRefTable: 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An ref table 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an Ref hash table. 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeRefTable(xmlRefTablePtr table) { 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(table, (xmlHashDeallocator) xmlFreeRefList); 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsRef: 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element carrying the attribute 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the attribute 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determine whether an attribute is of type Ref. In case we have DTD(s) 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then this is simple, otherwise we use an heuristic: name Ref (upper 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or lowercase). 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the lookup result 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsRef(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = attr->doc; 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(0); 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO @@@ */ 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attrDecl; 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(0); 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, attr->name); 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->name); 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl != NULL) && 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attrDecl->atype == XML_ATTRIBUTE_IDREF || 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl->atype == XML_ATTRIBUTE_IDREFS)) 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRemoveRef: 3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the attribute 3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Remove the given attribute from the Ref table maintained internally. 3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if the lookup failed and 0 otherwise 3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRemoveRef(xmlDocPtr doc, xmlAttrPtr attr) { 3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListPtr ref_list; 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRefTablePtr table; 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ID; 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRemoveMemo target; 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(-1); 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) return(-1); 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlRefTablePtr) doc->refs; 3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ID = xmlNodeListGetString(doc, attr->children, 1); 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ID == NULL) 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ref_list = xmlHashLookup(table, ID); 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(ref_list == NULL) { 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ID); 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* At this point, ref_list refers to a list of references which 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have the same key as the supplied attr. Our list of references 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is ordered by reference address and we don't have that information 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here to use when removing. We'll have to walk the list and 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check for a matching attribute, when we find one stop the walk 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and remove the entry. 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The list is ordered by reference, so that means we don't have the 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key. Passing the list and the reference to the walker means we 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will have enough data to be able to remove the entry. 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target.l = ref_list; 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target.ap = attr; 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Remove the supplied attr from our list */ 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListWalk(ref_list, xmlWalkRemoveRef, &target); 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /*If the list is empty then remove the list entry in the hash */ 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlListEmpty(ref_list)) 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashUpdateEntry(table, ID, NULL, (xmlHashDeallocator) 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeRefList); 3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ID); 3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetRefs: 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: pointer to the document 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ID: the ID value 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the set of references for the supplied ID. 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not found, otherwise node set for the ID. 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListPtr 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetRefs(xmlDocPtr doc, const xmlChar *ID) { 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRefTablePtr table; 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ID == NULL) { 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlRefTablePtr) doc->refs; 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlHashLookup(table, ID)); 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines for validity checking * 3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdElementDesc: 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a pointer to the DtD to search 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the element name 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for the description of this element 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the xmlElementPtr if found or NULL 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementPtr 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdElementDesc(xmlDtdPtr dtd, const xmlChar *name) { 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementTablePtr table; 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr cur; 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *uqname = NULL, *prefix = NULL; 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd == NULL) || (name == NULL)) return(NULL); 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->elements == NULL) 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlElementTablePtr) dtd->elements; 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uqname = xmlSplitQName2(name, &prefix); 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = uqname; 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlHashLookup2(table, name, prefix); 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) xmlFree(prefix); 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) xmlFree(uqname); 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdElementDesc2: 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a pointer to the DtD to search 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the element name 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @create: create an empty description if not found 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for the description of this element 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the xmlElementPtr if found or NULL 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlElementPtr 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, int create) { 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementTablePtr table; 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr cur; 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *uqname = NULL, *prefix = NULL; 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) return(NULL); 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->elements == NULL) { 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->doc != NULL) 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = dtd->doc->dict; 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!create) 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the Element table if needed. 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlElementTablePtr) dtd->elements; 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = xmlHashCreateDict(0, dict); 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->elements = (void *) table; 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) { 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "element table allocation failed"); 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlElementTablePtr) dtd->elements; 3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uqname = xmlSplitQName2(name, &prefix); 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = uqname; 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlHashLookup2(table, name, prefix); 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) && (create)) { 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(NULL, "malloc failed"); 3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlElement)); 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_ELEMENT_DECL; 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = xmlStrdup(name); 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prefix = xmlStrdup(prefix); 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->etype = XML_ELEMENT_TYPE_UNDEFINED; 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashAddEntry2(table, name, prefix, cur); 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) xmlFree(prefix); 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) xmlFree(uqname); 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdQElementDesc: 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a pointer to the DtD to search 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the element name 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the element namespace prefix 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for the description of this element 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the xmlElementPtr if found or NULL 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlElementPtr 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdQElementDesc(xmlDtdPtr dtd, const xmlChar *name, 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix) { 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementTablePtr table; 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) return(NULL); 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->elements == NULL) return(NULL); 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlElementTablePtr) dtd->elements; 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashLookup2(table, name, prefix)); 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdAttrDesc: 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a pointer to the DtD to search 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element name 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the attribute name 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for the description of this attribute on 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this element. 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the xmlAttributePtr if found or NULL 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAttributePtr 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdAttrDesc(xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name) { 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributeTablePtr table; 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr cur; 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *uqname = NULL, *prefix = NULL; 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) return(NULL); 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->attributes == NULL) return(NULL); 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlAttributeTablePtr) dtd->attributes; 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uqname = xmlSplitQName2(name, &prefix); 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) { 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlHashLookup3(table, uqname, prefix, elem); 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) xmlFree(prefix); 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uqname != NULL) xmlFree(uqname); 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlHashLookup3(table, name, NULL, elem); 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdQAttrDesc: 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a pointer to the DtD to search 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the element name 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the attribute name 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the attribute namespace prefix 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for the description of this qualified attribute on 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this element. 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the xmlAttributePtr if found or NULL 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAttributePtr 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdQAttrDesc(xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name, 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix) { 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributeTablePtr table; 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) return(NULL); 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->attributes == NULL) return(NULL); 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlAttributeTablePtr) dtd->attributes; 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashLookup3(table, name, prefix, elem)); 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdNotationDesc: 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a pointer to the DtD to search 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the notation name 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the DTD for the description of this notation 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the xmlNotationPtr if found or NULL 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNotationPtr 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdNotationDesc(xmlDtdPtr dtd, const xmlChar *name) { 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationTablePtr table; 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) return(NULL); 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->notations == NULL) return(NULL); 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlNotationTablePtr) dtd->notations; 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashLookup(table, name)); 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateNotationUse: 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @notationName: the notation name to check 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given name match a notation declaration. 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Notation Declared ] 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateNotationUse(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *notationName) { 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr notaDecl; 3354df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((doc == NULL) || (doc->intSubset == NULL) || 3355df143a5041f03a22808b59c76698770b74692815Selim Gurun (notationName == NULL)) return(-1); 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project notaDecl = xmlGetDtdNotationDesc(doc->intSubset, notationName); 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((notaDecl == NULL) && (doc->extSubset != NULL)) 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project notaDecl = xmlGetDtdNotationDesc(doc->extSubset, notationName); 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((notaDecl == NULL) && (ctxt != NULL)) { 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) doc, XML_DTD_UNKNOWN_NOTATION, 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NOTATION %s is not declared\n", 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project notationName, NULL, NULL); 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMixedElement: 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the element name 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the DtDs whether an element accept Mixed content (or ANY) 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically if it is supposed to accept text childs 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 0 if no, 1 if yes, and -1 if no element description is available 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) { 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl; 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc == NULL) || (doc->intSubset == NULL)) return(-1); 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlGetDtdElementDesc(doc->intSubset, name); 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl == NULL) && (doc->extSubset != NULL)) 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlGetDtdElementDesc(doc->extSubset, name); 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl == NULL) return(-1); 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (elemDecl->etype) { 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_UNDEFINED: 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ELEMENT: 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_EMPTY: 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * return 1 for EMPTY since we want VC error to pop up 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on <empty> </empty> for example 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ANY: 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_MIXED: 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED 341060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 341160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 341260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlIsDocNameStartChar(xmlDocPtr doc, int c) { 341360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { 341460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 341560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Use the new checks of production [4] [4a] amd [5] of the 341660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Update 5 of XML-1.0 341760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 341860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (((c >= 'a') && (c <= 'z')) || 341960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 'A') && (c <= 'Z')) || 342060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '_') || (c == ':') || 342160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xC0) && (c <= 0xD6)) || 342260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xD8) && (c <= 0xF6)) || 342360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xF8) && (c <= 0x2FF)) || 342460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x370) && (c <= 0x37D)) || 342560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x37F) && (c <= 0x1FFF)) || 342660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x200C) && (c <= 0x200D)) || 342760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x2070) && (c <= 0x218F)) || 342860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x2C00) && (c <= 0x2FEF)) || 342960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x3001) && (c <= 0xD7FF)) || 343060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xF900) && (c <= 0xFDCF)) || 343160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xFDF0) && (c <= 0xFFFD)) || 343260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x10000) && (c <= 0xEFFFF))) 343360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(1); 343460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 343560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (IS_LETTER(c) || (c == '_') || (c == ':')) 343660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(1); 343760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 343860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(0); 343960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 344060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 344160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 344260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlIsDocNameChar(xmlDocPtr doc, int c) { 344360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { 344460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 344560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Use the new checks of production [4] [4a] amd [5] of the 344660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Update 5 of XML-1.0 344760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 344860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (((c >= 'a') && (c <= 'z')) || 344960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 'A') && (c <= 'Z')) || 345060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= '0') && (c <= '9')) || /* !start */ 345160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '_') || (c == ':') || 345260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ 345360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xC0) && (c <= 0xD6)) || 345460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xD8) && (c <= 0xF6)) || 345560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xF8) && (c <= 0x2FF)) || 345660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x300) && (c <= 0x36F)) || /* !start */ 345760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x370) && (c <= 0x37D)) || 345860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x37F) && (c <= 0x1FFF)) || 345960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x200C) && (c <= 0x200D)) || 346060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ 346160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x2070) && (c <= 0x218F)) || 346260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x2C00) && (c <= 0x2FEF)) || 346360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x3001) && (c <= 0xD7FF)) || 346460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xF900) && (c <= 0xFDCF)) || 346560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0xFDF0) && (c <= 0xFFFD)) || 346660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((c >= 0x10000) && (c <= 0xEFFFF))) 346760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(1); 346860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 346960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((IS_LETTER(c)) || (IS_DIGIT(c)) || 347060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '.') || (c == '-') || 347160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '_') || (c == ':') || 347260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (IS_COMBINING(c)) || 347360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (IS_EXTENDER(c))) 347460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(1); 347560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 347660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(0); 347760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 347860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateNameValue: 348160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @doc: pointer to the document or NULL 3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: an Name value 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given value match Name production 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 348960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 349060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNameValueInternal(xmlDocPtr doc, const xmlChar *value) { 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) return(0); 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = value; 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 349860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!xmlIsDocNameStartChar(doc, val)) 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 350360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (xmlIsDocNameChar(doc, val)) { 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != 0) return(0); 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 351460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNameValue: 351560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: an Name value 351660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 351760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Validate that the given value match Name production 351860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 351960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * returns 1 if valid or 0 otherwise 352060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 352160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 352260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint 352360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNameValue(const xmlChar *value) { 352460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNameValueInternal(NULL, value)); 352560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 352660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 352760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 352860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNamesValueInternal: 352960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @doc: pointer to the document or NULL 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: an Names value 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given value match Names production 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 353760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 353860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNamesValueInternal(xmlDocPtr doc, const xmlChar *value) { 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) return(0); 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = value; 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 354660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 354760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!xmlIsDocNameStartChar(doc, val)) 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 355260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (xmlIsDocNameChar(doc, val)) { 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Should not test IS_BLANK(val) here -- see erratum E20*/ 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (val == 0x20) { 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (val == 0x20) { 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 356460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!xmlIsDocNameStartChar(doc, val)) 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 356660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 357060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (xmlIsDocNameChar(doc, val)) { 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != 0) return(0); 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 358260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNamesValue: 358360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: an Names value 358460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 358560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Validate that the given value match Names production 358660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 358760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * returns 1 if valid or 0 otherwise 358860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 358960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 359060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint 359160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNamesValue(const xmlChar *value) { 359260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNamesValueInternal(NULL, value)); 359360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 359460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 359560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 359660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNmtokenValueInternal: 359760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @doc: pointer to the document or NULL 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: an Nmtoken value 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given value match Nmtoken production 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: Name Token ] 360360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 360760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 360860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNmtokenValueInternal(xmlDocPtr doc, const xmlChar *value) { 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) return(0); 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = value; 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 361660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 361760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!xmlIsDocNameChar(doc, val)) 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 362060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott val = xmlStringCurrentChar(NULL, cur, &len); 362160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur += len; 362260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (xmlIsDocNameChar(doc, val)) { 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != 0) return(0); 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 363360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNmtokenValue: 363460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: an Nmtoken value 363560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 363660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Validate that the given value match Nmtoken production 363760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 363860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [ VC: Name Token ] 363960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 364060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * returns 1 if valid or 0 otherwise 364160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 364260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 364360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint 364460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNmtokenValue(const xmlChar *value) { 364560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNmtokenValueInternal(NULL, value)); 364660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 364760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 364860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 364960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNmtokensValueInternal: 365060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @doc: pointer to the document or NULL 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: an Nmtokens value 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given value match Nmtokens production 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: Name Token ] 365660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 366060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 366160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNmtokensValueInternal(xmlDocPtr doc, const xmlChar *value) { 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) return(0); 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = value; 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 366960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK(val)) { 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 367560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!xmlIsDocNameChar(doc, val)) 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 367860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (xmlIsDocNameChar(doc, val)) { 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Should not test IS_BLANK(val) here -- see erratum E20*/ 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (val == 0x20) { 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (val == 0x20) { 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == 0) return(1); 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 369160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!xmlIsDocNameChar(doc, val)) 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 369460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott val = xmlStringCurrentChar(NULL, cur, &len); 369560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur += len; 369660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 369760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (xmlIsDocNameChar(doc, val)) { 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != 0) return(0); 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 370960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateNmtokensValue: 371060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: an Nmtokens value 371160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 371260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Validate that the given value match Nmtokens production 371360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 371460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [ VC: Name Token ] 371560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 371660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * returns 1 if valid or 0 otherwise 371760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 371860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 371960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint 372060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateNmtokensValue(const xmlChar *value) { 372160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNmtokensValueInternal(NULL, value)); 372260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 372360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 372460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateNotationDecl: 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nota: a notation definition 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a single notation definition 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks as described by the 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - it seems that no validity constraint exists on notation declarations 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * But this function get called anyway ... 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateNotationDecl(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlDocPtr doc ATTRIBUTE_UNUSED, 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr nota ATTRIBUTE_UNUSED) { 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 374860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlValidateAttributeValueInternal: 374960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @doc: the document 375060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @type: an attribute type 375160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: an attribute value 375260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 375360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Validate that the given attribute value match the proper production 375460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 375560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * returns 1 if valid or 0 otherwise 375660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 375760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 375860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int 375960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, 376060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *value) { 376160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (type) { 376260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_ENTITIES: 376360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_IDREFS: 376460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNamesValueInternal(doc, value)); 376560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_ENTITY: 376660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_IDREF: 376760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_ID: 376860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_NOTATION: 376960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNameValueInternal(doc, value)); 377060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_NMTOKENS: 377160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_ENUMERATION: 377260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNmtokensValueInternal(doc, value)); 377360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_NMTOKEN: 377460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateNmtokenValueInternal(doc, value)); 377560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ATTRIBUTE_CDATA: 377660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 377760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 377860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(1); 377960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 378060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 378160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateAttributeValue: 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: an attribute type 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: an attribute value 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given attribute value match the proper production 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: ID ] 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type ID must match the Name production.... 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: IDREF ] 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type IDREF must match the Name production, and values 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of type IDREFS must match Names ... 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: Entity Name ] 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type ENTITY must match the Name production, values 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of type ENTITIES must match Names ... 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: Name Token ] 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type NMTOKEN must match the Nmtoken production; values 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of type NMTOKENS must match Nmtokens. 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value) { 380760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlValidateAttributeValueInternal(NULL, type, value)); 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateAttributeValue2: 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the attribute name (used for error reporting only) 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the attribute type 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the attribute value 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate that the given attribute value match a given type. 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This typically cannot be done before having finished parsing 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the subsets. 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: IDREF ] 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type IDREF must match one of the declared IDs 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type IDREFS must match a sequence of the declared IDs 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * each Name must match the value of an ID attribute on some element 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the XML document; i.e. IDREF values must match the value of 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some ID attribute 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: Entity Name ] 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type ENTITY must match one declared entity 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Values of type ENTITIES must match a sequence of declared entities 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [ VC: Notation Attributes ] 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * all notation names in the declaration must be declared. 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateAttributeValue2(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, xmlAttributeType type, const xmlChar *value) { 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREFS: 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREF: 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ID: 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKENS: 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENUMERATION: 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKEN: 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_CDATA: 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITY: { 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr ent; 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = xmlGetDocEntity(doc, value); 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* yeah it's a bit messy... */ 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ent == NULL) && (doc->standalone == 1)) { 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->standalone = 0; 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = xmlGetDocEntity(doc, value); 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent == NULL) { 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) doc, 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_UNKNOWN_ENTITY, 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ENTITY attribute %s reference an unknown entity \"%s\"\n", 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, value, NULL); 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) doc, 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_ENTITY_TYPE, 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ENTITY attribute %s reference an entity \"%s\" of wrong type\n", 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, value, NULL); 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITIES: { 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *dup, *nam = NULL, *cur, save; 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr ent; 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dup = xmlStrdup(value); 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dup == NULL) 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = dup; 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nam = cur; 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project save = *cur; 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = 0; 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = xmlGetDocEntity(doc, nam); 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent == NULL) { 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) doc, 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_UNKNOWN_ENTITY, 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ENTITIES attribute %s reference an unknown entity \"%s\"\n", 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, nam, NULL); 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) doc, 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_ENTITY_TYPE, 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ENTITIES attribute %s reference an entity \"%s\" of wrong type\n", 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, nam, NULL); 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (save == 0) 3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = save; 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(dup); 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NOTATION: { 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr nota; 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nota = xmlGetDtdNotationDesc(doc->intSubset, value); 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nota == NULL) && (doc->extSubset != NULL)) 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nota = xmlGetDtdNotationDesc(doc->extSubset, value); 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota == NULL) { 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) doc, 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_UNKNOWN_NOTATION, 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NOTATION attribute %s reference an unknown notation \"%s\"\n", 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, value, NULL); 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidCtxtNormalizeAttributeValue: 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the parent 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the attribute name 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the attribute value 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context or NULL 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Does the validation related extra step of the normalization of attribute 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * values: 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the declared value is not CDATA, then the XML processor must further 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * process the normalized attribute value by discarding any leading and 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * trailing space (#x20) characters, and by replacing sequences of space 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (#x20) characters by single space (#x20) character. 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also check VC: Standalone Document Declaration in P32, and update 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt->valid accordingly 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns a new normalized string if normalization is needed, NULL otherwise 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller must free the returned value. 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem, const xmlChar *name, const xmlChar *value) { 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret, *dst; 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *src; 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attrDecl = NULL; 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int extsubset = 0; 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(NULL); 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(NULL); 3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) return(NULL); 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) return(NULL); 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, name); 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) { 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, name); 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl != NULL) 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extsubset = 1; 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != elem->name)) 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->intSubset != NULL)) 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, name); 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) { 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name, name); 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl != NULL) 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extsubset = 1; 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl == NULL) 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_CDATA) 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup(value); 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project src = value; 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dst = ret; 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*src == 0x20) src++; 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*src != 0) { 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*src == 0x20) { 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*src == 0x20) src++; 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*src != 0) 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *dst++ = 0x20; 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *dst++ = *src++; 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *dst = 0; 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->standalone) && (extsubset == 1) && (!xmlStrEqual(value, ret))) { 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_NOT_STANDALONE, 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"standalone: %s on %s value had to be normalized based on external subset declaration\n", 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, elem->name, NULL); 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidNormalizeAttributeValue: 4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the parent 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the attribute name 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the attribute value 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Does the validation related extra step of the normalization of attribute 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * values: 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the declared value is not CDATA, then the XML processor must further 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * process the normalized attribute value by discarding any leading and 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * trailing space (#x20) characters, and by replacing sequences of space 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (#x20) characters by single space (#x20) character. 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new normalized string if normalization is needed, NULL otherwise 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller must free the returned value. 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *value) { 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret, *dst; 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *src; 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attrDecl = NULL; 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(NULL); 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(NULL); 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) return(NULL); 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) return(NULL); 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 4056df143a5041f03a22808b59c76698770b74692815Selim Gurun 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != elem->name)) 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, name); 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name, name); 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl == NULL) 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_CDATA) 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup(value); 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project src = value; 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dst = ret; 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*src == 0x20) src++; 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*src != 0) { 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*src == 0x20) { 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*src == 0x20) src++; 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*src != 0) 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *dst++ = 0x20; 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *dst++ = *src++; 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *dst = 0; 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateAttributeIdCallback(xmlAttributePtr attr, int *count, 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar* name ATTRIBUTE_UNUSED) { 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->atype == XML_ATTRIBUTE_ID) (*count)++; 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateAttributeDecl: 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: an attribute definition 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a single attribute definition 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks as described by the 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Attribute Default Legal ] 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Enumeration ] 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: ID Attribute Default ] 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ID/IDREF uniqueness and matching are done separately 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attr) { 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val; 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_DTD; 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(attr == NULL) return(1); 412260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Attribute Default Legal */ 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Enumeration */ 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->defaultValue != NULL) { 412660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott val = xmlValidateAttributeValueInternal(doc, attr->atype, 412760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott attr->defaultValue); 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == 0) { 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_DEFAULT, 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Syntax of default value for attribute %s of %s is not valid\n", 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, attr->elem, NULL); 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= val; 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ID Attribute Default */ 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->atype == XML_ATTRIBUTE_ID)&& 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->def != XML_ATTRIBUTE_IMPLIED) && 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->def != XML_ATTRIBUTE_REQUIRED)) { 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_FIXED, 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ID attribute %s of %s is not valid must be #IMPLIED or #REQUIRED\n", 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, attr->elem, NULL); 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* One ID per Element Type */ 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->atype == XML_ATTRIBUTE_ID) { 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbId; 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the trick is that we parse DtD as their own internal subset */ 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elem = xmlGetDtdElementDesc(doc->intSubset, 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->elem); 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem != NULL) { 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbId = xmlScanIDAttributeDecl(NULL, elem, 0); 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributeTablePtr table; 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The attribute may be declared in the internal subset and the 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in the external subset. 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbId = 0; 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->intSubset != NULL) { 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlAttributeTablePtr) doc->intSubset->attributes; 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan3(table, NULL, NULL, attr->elem, (xmlHashScanner) 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidateAttributeIdCallback, &nbId); 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbId > 1) { 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNodeNr(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has %d ID attribute defined in the internal subset : %s\n", 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->elem, nbId, attr->name); 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (doc->extSubset != NULL) { 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int extId = 0; 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = xmlGetDtdElementDesc(doc->extSubset, attr->elem); 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem != NULL) { 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extId = xmlScanIDAttributeDecl(NULL, elem, 0); 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extId > 1) { 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNodeNr(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s has %d ID attribute defined in the external subset : %s\n", 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->elem, extId, attr->name); 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (extId + nbId > 1) { 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Element %s has ID attributes defined in the internal and external subset : %s\n", 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->elem, attr->name, NULL); 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Enumeration */ 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->defaultValue != NULL) && (attr->tree != NULL)) { 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr tree = attr->tree; 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tree != NULL) { 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(tree->name, attr->defaultValue)) break; 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tree = tree->next; 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tree == NULL) { 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_VALUE, 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Default value \"%s\" for attribute %s of %s is not among the enumerated set\n", 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->defaultValue, attr->name, attr->elem); 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateElementDecl: 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element definition 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a single element definition 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks as described by the 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: One ID per Element Type ] 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: No Duplicate Types ] 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Unique Element Type Declaration ] 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateElementDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elem) { 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr tst; 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_DTD; 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(1); 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Build the regexp associated to the content model */ 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidBuildContentModel(ctxt, elem); 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* No Duplicate Types */ 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->etype == XML_ELEMENT_TYPE_MIXED) { 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr cur, next; 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = elem->content; 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_ELEMENT_CONTENT_OR) break; 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->c1 == NULL) break; 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->c1->type == XML_ELEMENT_CONTENT_ELEMENT) { 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = cur->c1->name; 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = cur->c2; 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (next != NULL) { 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next->type == XML_ELEMENT_CONTENT_ELEMENT) { 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(next->name, name)) && 4258df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlStrEqual(next->prefix, cur->c1->prefix))) { 4259df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->c1->prefix == NULL) { 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Definition of %s has duplicate references of %s\n", 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, name, NULL); 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Definition of %s has duplicate references of %s:%s\n", 4266df143a5041f03a22808b59c76698770b74692815Selim Gurun elem->name, cur->c1->prefix, name); 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next->c1 == NULL) break; 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next->c1->type != XML_ELEMENT_CONTENT_ELEMENT) break; 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(next->c1->name, name)) && 4275df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlStrEqual(next->c1->prefix, cur->c1->prefix))) { 4276df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->c1->prefix == NULL) { 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Definition of %s has duplicate references to %s\n", 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, name, NULL); 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Definition of %s has duplicate references to %s:%s\n", 4283df143a5041f03a22808b59c76698770b74692815Selim Gurun elem->name, cur->c1->prefix, name); 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = next->c2; 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->c2; 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* VC: Unique Element Type Declaration */ 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tst = xmlGetDtdElementDesc(doc->intSubset, elem->name); 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tst != NULL ) && (tst != elem) && 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((tst->prefix == elem->prefix) || 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(tst->prefix, elem->prefix))) && 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) { 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_ELEM_REDEFINED, 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Redefinition of element %s\n", 4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tst = xmlGetDtdElementDesc(doc->extSubset, elem->name); 4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tst != NULL ) && (tst != elem) && 4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((tst->prefix == elem->prefix) || 4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(tst->prefix, elem->prefix))) && 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) { 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_ELEM_REDEFINED, 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Redefinition of element %s\n", 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* One ID per Element Type 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * already done when registering the attribute 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlScanIDAttributeDecl(ctxt, elem) > 1) { 4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } */ 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateOneAttribute: 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: an attribute instance 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the attribute value (without entities processing) 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a single attribute for an element 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks as described by the 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Attribute Value Type ] 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Fixed Attribute Default ] 4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Entity Name ] 4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Name Token ] 4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: ID ] 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: IDREF ] 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Entity Name ] 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Notation Attributes ] 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ID/IDREF uniqueness and matching are done separately 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem, xmlAttrPtr attr, const xmlChar *value) 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attrDecl = NULL; 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val; 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_DTD; 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem == NULL) || (elem->name == NULL)) return(0); 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr == NULL) || (attr->name == NULL)) return(0); 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->ns != NULL) { 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, attr->ns->prefix); 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, fullname, 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, attr->ns->prefix); 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, attr->name); 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname, attr->name); 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != elem->name)) 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl == NULL) { 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->ns != NULL) { 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elem->name, 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, attr->ns->prefix); 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elem->name, 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, attr->ns->prefix); 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->name); 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->name); 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Attribute Value Type */ 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl == NULL) { 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "No declaration for attribute %s of element %s\n", 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, elem->name, NULL); 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->atype = attrDecl->atype; 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 440860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == 0) { 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Syntax of value for attribute %s of %s is not valid\n", 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, elem->name, NULL); 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity constraint: Fixed Attribute Default */ 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->def == XML_ATTRIBUTE_FIXED) { 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(value, attrDecl->defaultValue)) { 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value for attribute %s of %s is different from default \"%s\"\n", 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, elem->name, attrDecl->defaultValue); 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: ID uniqueness */ 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_ID) { 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlAddID(ctxt, doc, value, attr) == NULL) 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlAddRef(ctxt, doc, value, attr) == NULL) 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Notation Attributes */ 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr tree = attrDecl->tree; 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr nota; 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* First check that the given NOTATION was declared */ 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nota = xmlGetDtdNotationDesc(doc->intSubset, value); 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota == NULL) 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nota = xmlGetDtdNotationDesc(doc->extSubset, value); 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota == NULL) { 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value \"%s\" for attribute %s of %s is not a declared Notation\n", 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, attr->name, elem->name); 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Second, verify that it's among the list */ 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tree != NULL) { 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(tree->name, value)) break; 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tree = tree->next; 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tree == NULL) { 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Value \"%s\" for attribute %s of %s is not among the enumerated notations\n", 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, attr->name, elem->name); 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Enumeration */ 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr tree = attrDecl->tree; 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tree != NULL) { 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(tree->name, value)) break; 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tree = tree->next; 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tree == NULL) { 4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, 4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value \"%s\" for attribute %s of %s is not among the enumerated set\n", 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, attr->name, elem->name); 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Fixed Attribute Default */ 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl->def == XML_ATTRIBUTE_FIXED) && 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(attrDecl->defaultValue, value))) { 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value for attribute %s of %s must be \"%s\"\n", 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, elem->name, attrDecl->defaultValue); 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Extra check for the attribute value */ 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateAttributeValue2(ctxt, doc, attr->name, 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl->atype, value); 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateOneNamespace: 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the namespace prefix 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: an namespace declaration instance 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the attribute value (without entities processing) 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a single namespace declaration for an element 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks as described by the 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Attribute Value Type ] 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Fixed Attribute Default ] 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Entity Name ] 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Name Token ] 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: ID ] 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: IDREF ] 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Entity Name ] 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Notation Attributes ] 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ID/IDREF uniqueness and matching are done separately 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateOneNamespace(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlElementPtr elemDecl; */ 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attrDecl = NULL; 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val; 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_DTD; 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem == NULL) || (elem->name == NULL)) return(0); 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->href == NULL)) return(0); 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) { 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(elem->name, prefix, fn, 50); 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) { 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "Validating namespace"); 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, BAD_CAST "xmlns"); 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, fullname, 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, BAD_CAST "xmlns"); 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "xmlns"); 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "xmlns"); 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != elem->name)) 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl == NULL) { 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elem->name, 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, BAD_CAST "xmlns"); 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elem->name, 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, BAD_CAST "xmlns"); 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->intSubset, 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, BAD_CAST "xmlns"); 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl == NULL) && (doc->extSubset != NULL)) 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl = xmlGetDtdAttrDesc(doc->extSubset, 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, BAD_CAST "xmlns"); 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Attribute Value Type */ 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl == NULL) { 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "No declaration for attribute xmlns:%s of element %s\n", 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, elem->name, NULL); 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "No declaration for attribute xmlns of element %s\n", 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 459360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == 0) { 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Syntax of value for attribute xmlns:%s of %s is not valid\n", 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, elem->name, NULL); 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Syntax of value for attribute xmlns of %s is not valid\n", 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity constraint: Fixed Attribute Default */ 4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->def == XML_ATTRIBUTE_FIXED) { 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(value, attrDecl->defaultValue)) { 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value for attribute xmlns:%s of %s is different from default \"%s\"\n", 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, elem->name, attrDecl->defaultValue); 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value for attribute xmlns of %s is different from default \"%s\"\n", 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attrDecl->defaultValue, NULL); 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: ID uniqueness */ 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_ID) { 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlAddID(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlAddRef(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Notation Attributes */ 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr tree = attrDecl->tree; 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNotationPtr nota; 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* First check that the given NOTATION was declared */ 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nota = xmlGetDtdNotationDesc(doc->intSubset, value); 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota == NULL) 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nota = xmlGetDtdNotationDesc(doc->extSubset, value); 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nota == NULL) { 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value \"%s\" for attribute xmlns:%s of %s is not a declared Notation\n", 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, ns->prefix, elem->name); 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value \"%s\" for attribute xmlns of %s is not a declared Notation\n", 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, elem->name, NULL); 4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Second, verify that it's among the list */ 4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tree != NULL) { 4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(tree->name, value)) break; 4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tree = tree->next; 4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tree == NULL) { 4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, 4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Value \"%s\" for attribute xmlns:%s of %s is not among the enumerated notations\n", 4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, ns->prefix, elem->name); 4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, 4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Value \"%s\" for attribute xmlns of %s is not among the enumerated notations\n", 4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, elem->name, NULL); 4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Validity Constraint: Enumeration */ 4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { 4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr tree = attrDecl->tree; 4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tree != NULL) { 4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(tree->name, value)) break; 4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tree = tree->next; 4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tree == NULL) { 4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, 4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Value \"%s\" for attribute xmlns:%s of %s is not among the enumerated set\n", 4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, ns->prefix, elem->name); 4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, 4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"Value \"%s\" for attribute xmlns of %s is not among the enumerated set\n", 4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value, elem->name, NULL); 4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Fixed Attribute Default */ 4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attrDecl->def == XML_ATTRIBUTE_FIXED) && 4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(attrDecl->defaultValue, value))) { 4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, 4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value for attribute xmlns:%s of %s must be \"%s\"\n", 4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns->prefix, elem->name, attrDecl->defaultValue); 4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, 4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Value for attribute xmlns of %s must be \"%s\"\n", 4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attrDecl->defaultValue, NULL); 4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Extra check for the attribute value */ 4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateAttributeValue2(ctxt, doc, ns->prefix, 4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl->atype, value); 4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateAttributeValue2(ctxt, doc, BAD_CAST "xmlns", 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrDecl->atype, value); 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_REGEXP_ENABLED 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateSkipIgnorable: 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child: the child list 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip ignorable elements w.r.t. the validation process 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the first element to consider for validation of the content model 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateSkipIgnorable(xmlNodePtr child) { 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (child->type) { 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* These things are ignored (skipped) during validation. */ 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlIsBlankNode(child)) 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(child); 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* keep current node */ 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(child); 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(child); 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateElementType: 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate the content model of an element internal function 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 ,-1 in case of error, -2 if an entity 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reference is found and -3 if the validation succeeded but 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content model is not determinist. 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateElementType(xmlValidCtxtPtr ctxt) { 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = -1; 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist = 1; 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = xmlValidateSkipIgnorable(NODE); 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE == NULL) && (CONT == NULL)) 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE == NULL) && 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CONT->ocur == XML_ELEMENT_CONTENT_OPT))) { 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CONT == NULL) return(-1); 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE != NULL) && (NODE->type == XML_ENTITY_REF_NODE)) 4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We arrive here when more states need to be examined 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcont: 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We just recovered from a rollback generated by a possible 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * epsilon transition, go directly to the analysis phase 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (STATE == ROLLBACK_PARENT) { 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("restored parent branch"); 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_STATE(NODE, CONT) 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto analyze; 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_STATE(NODE, CONT) 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we may have to save a backup state here. This is the equivalent 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of handling epsilon transition in NFAs. 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CONT != NULL) && 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CONT->parent == NULL) || 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CONT->parent->type != XML_ELEMENT_CONTENT_OR)) && 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CONT->ocur == XML_ELEMENT_CONTENT_OPT) || 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURRENCE)))) { 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("saving parent branch"); 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT) < 0) 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check first if the content matches 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (CONT->type) { 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NODE == NULL) { 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("pcdata failed no node"); 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NODE->type == XML_TEXT_NODE) { 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("pcdata found, skip to next"); 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * go to next element in the content model 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * skipping ignorable elems 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = NODE->next; 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = xmlValidateSkipIgnorable(NODE); 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE != NULL) && 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NODE->type == XML_ENTITY_REF_NODE)) 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((NODE != NULL) && 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((NODE->type != XML_ELEMENT_NODE) && 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NODE->type != XML_TEXT_NODE) && 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NODE->type != XML_CDATA_SECTION_NODE))); 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("pcdata failed"); 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NODE == NULL) { 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("element failed no node"); 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((NODE->type == XML_ELEMENT_NODE) && 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(NODE->name, CONT->name))); 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (CONT->prefix == NULL); 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CONT->prefix == NULL) { 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(NODE->ns->prefix, CONT->prefix); 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("element found, skip to next"); 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * go to next element in the content model 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * skipping ignorable elems 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = NODE->next; 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = xmlValidateSkipIgnorable(NODE); 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE != NULL) && 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NODE->type == XML_ENTITY_REF_NODE)) 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((NODE != NULL) && 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((NODE->type != XML_ELEMENT_NODE) && 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NODE->type != XML_TEXT_NODE) && 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NODE->type != XML_CDATA_SECTION_NODE))); 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("element failed"); 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Small optimization. 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CONT->c1->type == XML_ELEMENT_CONTENT_ELEMENT) { 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE == NULL) || 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(NODE->name, CONT->c1->name))) { 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH++; 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->c2; 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (CONT->c1->prefix == NULL); 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CONT->c1->prefix == NULL) { 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix); 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH++; 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->c2; 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * save the second branch 'or' branch 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("saving 'or' branch"); 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vstateVPush(ctxt, CONT->c2, NODE, (unsigned char)(DEPTH + 1), 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project OCCURS, ROLLBACK_OR) < 0) 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH++; 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->c1; 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Small optimization. 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CONT->c1->type == XML_ELEMENT_CONTENT_ELEMENT) && 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CONT->c1->ocur == XML_ELEMENT_CONTENT_OPT) || 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CONT->c1->ocur == XML_ELEMENT_CONTENT_MULT))) { 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE == NULL) || 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(NODE->name, CONT->c1->name))) { 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH++; 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->c2; 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (CONT->c1->prefix == NULL); 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CONT->c1->prefix == NULL) { 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix); 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH++; 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->c2; 4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH++; 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->c1; 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * At this point handle going up in the tree 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -1) { 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("error found returning"); 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectanalyze: 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CONT != NULL) { 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First do the analysis depending on the occurrence model at 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this level. 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (CONT->ocur) { 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->vstate->node; 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Once branch failed, rollback"); 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vstateVPop(ctxt) < 0 ) { 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("exhaustion, failed"); 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != ctxt->vstate->node) 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project determinist = -3; 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (OCCURRENCE == 0) { 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->vstate->node; 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Plus branch failed, rollback"); 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vstateVPop(ctxt) < 0 ) { 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("exhaustion, failed"); 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != ctxt->vstate->node) 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project determinist = -3; 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Plus branch found"); 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_VALID_ALGO 5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (OCCURRENCE == 0) { 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Mult branch failed"); 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Mult branch found"); 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Option branch failed"); 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (CONT->ocur) { 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OPT: 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Option branch succeeded"); 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ONCE: 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Once branch succeeded"); 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PLUS: 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (STATE == ROLLBACK_PARENT) { 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Plus branch rollback"); 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NODE == NULL) { 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Plus branch exhausted"); 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Plus branch succeeded, continuing"); 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SET_OCCURRENCE; 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_MULT: 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (STATE == ROLLBACK_PARENT) { 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Mult branch rollback"); 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NODE == NULL) { 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Mult branch exhausted"); 5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Mult branch succeeded, continuing"); 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* SET_OCCURRENCE; */ 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STATE = 0; 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then act accordingly at the parent level 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project RESET_OCCURRENCE; 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CONT->parent == NULL) 5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (CONT->parent->type) { 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Error: parent pcdata"); 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Error: parent element"); 5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Or succeeded"); 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->parent; 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH--; 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Or failed"); 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->parent; 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH--; 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Sequence failed"); 5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->parent; 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH--; 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CONT == CONT->parent->c1) { 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Sequence testing 2nd branch"); 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->parent->c2; 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Sequence succeeded"); 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = CONT->parent; 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH--; 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NODE != NULL) { 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->vstate->node; 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Failed, remaining input, rollback"); 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vstateVPop(ctxt) < 0 ) { 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("exhaustion, failed"); 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != ctxt->vstate->node) 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project determinist = -3; 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->vstate->node; 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Failure, rollback"); 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vstateVPop(ctxt) < 0 ) { 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("exhaustion, failed"); 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != ctxt->vstate->node) 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project determinist = -3; 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto cont; 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(determinist); 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSnprintfElements: 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: an output buffer 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the buffer 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: An element 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @glob: 1 if one must print the englobing parenthesis, 0 otherwise 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the list of elements to the buffer 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Intended just for the debug routine 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSnprintfElements(char *buf, int size, xmlNodePtr node, int glob) { 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) return; 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) strcat(buf, "("); 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node; 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = strlen(buf); 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < 50) { 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size - len > 4) && (buf[len - 1] != '.')) 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < xmlStrlen(cur->ns->prefix) + 10) { 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size - len > 4) && (buf[len - 1] != '.')) 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, (char *) cur->ns->prefix); 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, ":"); 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size - len < xmlStrlen(cur->name) + 10) { 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size - len > 4) && (buf[len - 1] != '.')) 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " ..."); 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, (char *) cur->name); 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " "); 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlIsBlankNode(cur)) 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, "CDATA"); 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " "); 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, "???"); 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat(buf, " "); 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) strcat(buf, ")"); 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateElementContent: 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child: the child list 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDecl: pointer to the element declaration 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: emit the error message 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: the parent element (for error reporting) 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate the content model of an element 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 if not and -1 in case of error 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child, 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl, int warn, xmlNodePtr parent) { 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_REGEXP_ENABLED 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr repl = NULL, last = NULL, tmp; 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr cont; 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl == NULL) 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = elemDecl->content; 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = elemDecl->name; 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Build the regexp associated to the content model */ 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl->contModel == NULL) 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidBuildContentModel(ctxt, elemDecl); 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl->contModel == NULL) { 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlRegexpIsDeterminist(elemDecl->contModel)) { 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = NULL; 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec != NULL) { 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = child; 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push the current node to be able to roll back 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and process within the entity 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children != NULL) && 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->children != NULL)) { 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeVPush(ctxt, cur); 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children->children; 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlIsBlankNode(cur)) 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto fail; 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO */ 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto fail; 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(cur->name, 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns->prefix, fn, 50); 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) { 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto fail; 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, fullname, NULL); 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != cur->name)) 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, cur->name, NULL); 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to next element 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur == NULL) { 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = nodeVPop(ctxt); 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(exec, NULL, NULL); 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfail: 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeExecCtxt(exec); 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* LIBXML_REGEXP_ENABLED */ 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the stack 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax = 8; 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab = (xmlValidState *) xmlMalloc( 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateTab == NULL) { 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The first entry in the stack is reserved to the current state 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = NULL; 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = &ctxt->vstateTab[0]; 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateNr = 1; 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = cont; 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = child; 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH = 0; 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project OCCURS = 0; 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STATE = 0; 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateElementType(ctxt); 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == -3) && (warn)) { 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidWarning(ctxt, child, XML_DTD_CONTENT_NOT_DETERMINIST, 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Content model for Element %s is ambiguous\n", 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL, NULL); 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == -2) { 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * An entities reference appeared at this level. 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Buid a minimal representation of this node content 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * sufficient to run the validation process on it 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEBUG_VALID_MSG("Found an entity reference, linearizing"); 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = child; 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push the current node to be able to roll back 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and process within the entity 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children != NULL) && 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->children != NULL)) { 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeVPush(ctxt, cur); 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children->children; 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlIsBlankNode(cur)) 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new node and minimally fills in 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * what's required 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); 5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "malloc failed"); 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList(repl); 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->type = cur->type; 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->name = cur->name; 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->ns = cur->ns; 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = NULL; 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->content = NULL; 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (repl == NULL) 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project repl = last = tmp; 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->next = tmp; 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = tmp; 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_CDATA_SECTION_NODE) { 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E59 spaces in CDATA does not match the 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nonterminal S 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->content = xmlStrdup(BAD_CAST "CDATA"); 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to next element 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur == NULL) { 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = nodeVPop(ctxt); 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Relaunch the validation 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstate = &ctxt->vstateTab[0]; 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateNr = 1; 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CONT = cont; 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE = repl; 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DEPTH = 0; 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project OCCURS = 0; 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STATE = 0; 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateElementType(ctxt); 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((warn) && ((ret != 1) && (ret != -3))) { 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char expr[5000]; 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char list[5000]; 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expr[0] = 0; 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElementContent(&expr[0], 5000, cont, 1); 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list[0] = 0; 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_REGEXP_ENABLED 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (repl != NULL) 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElements(&list[0], 5000, repl, 1); 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSnprintfElements(&list[0], 5000, child, 1); 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s content does not follow the DTD, expecting %s, got %s\n", 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, BAD_CAST expr, BAD_CAST list); 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element content does not follow the DTD, expecting %s, got %s\n", 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST expr, BAD_CAST list, NULL); 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s content does not follow the DTD\n", 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL, NULL); 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element content does not follow the DTD\n", 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL); 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == -3) 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_REGEXP_ENABLED 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the copy if done, and free up the validation stack 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (repl != NULL) { 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = repl->next; 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(repl); 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project repl = tmp; 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateMax = 0; 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateTab != NULL) { 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->vstateTab); 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vstateTab = NULL; 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab != NULL) { 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->nodeTab); 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = NULL; 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateCdataElement: 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that an element follows #CDATA 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateOneCdataElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) { 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, child; 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (doc == NULL) || (elem == NULL)) 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = child; 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push the current node to be able to roll back 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and process within the entity 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children != NULL) && 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->children != NULL)) { 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeVPush(ctxt, cur); 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children->children; 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to next element 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur == NULL) { 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = nodeVPop(ctxt); 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab != NULL) { 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->nodeTab); 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = NULL; 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateCheckMixed: 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cont: the mixed content model 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @qname: the qualified name as appearing in the serialization 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given node is part of the content model. 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no, -1 in case of error 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateCheckMixed(xmlValidCtxtPtr ctxt, 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr cont, const xmlChar *qname) { 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int plen; 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlSplitQName3(qname, &plen); 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cont != NULL) { 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cont->prefix == NULL) && (xmlStrEqual(cont->name, qname))) 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 != NULL) && 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cont->c1->prefix == NULL) && 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cont->c1->name, qname))) 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 == NULL) || 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_DTD_MIXED_CORRUPT, 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: MIXED struct corrupted\n", 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = cont->c2; 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cont != NULL) { 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cont->prefix != NULL) && 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrncmp(cont->prefix, qname, plen) == 0) && 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cont->name, name))) 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 != NULL) && 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cont->c1->prefix != NULL) && 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrncmp(cont->c1->prefix, qname, plen) == 0) && 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cont->c1->name, name))) 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 == NULL) || 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_MIXED_CORRUPT, 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: MIXED struct corrupted\n", 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = cont->c2; 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidGetElemDecl: 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extsubset: pointer, (out) indicate if the declaration was found 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the external subset. 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finds a declaration associated to an element in the document. 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the pointer to the declaration or NULL if not found. 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlElementPtr 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidGetElemDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem, int *extsubset) { 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl = NULL; 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = NULL; 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (doc == NULL) || 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (elem == NULL) || (elem->name == NULL)) 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extsubset != NULL) 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *extsubset = 0; 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fetch the declaration for the qualified name 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix = elem->ns->prefix; 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) { 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlGetDtdQElementDesc(doc->intSubset, 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, prefix); 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl == NULL) && (doc->extSubset != NULL)) { 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlGetDtdQElementDesc(doc->extSubset, 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, prefix); 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl != NULL) && (extsubset != NULL)) 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *extsubset = 1; 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fetch the declaration for the non qualified name 5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is "non-strict" validation should be done on the 5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * full QName but in that case being flexible makes sense. 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl == NULL) { 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlGetDtdElementDesc(doc->intSubset, elem->name); 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl == NULL) && (doc->extSubset != NULL)) { 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlGetDtdElementDesc(doc->extSubset, elem->name); 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl != NULL) && (extsubset != NULL)) 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *extsubset = 1; 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl == NULL) { 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_UNKNOWN_ELEM, 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "No declaration for element %s\n", 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(elemDecl); 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidatePushElement: 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @qname: the qualified name as appearing in the serialization 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new element start on the validation stack. 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidatePushElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem, const xmlChar *qname) { 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr eDecl; 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int extsubset = 0; 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* printf("PushElem %s\n", qname); */ 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidStatePtr state = ctxt->vstate; 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl; 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the new element agaisnt the content model of the new elem. 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->elemDecl != NULL) { 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = state->elemDecl; 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(elemDecl->etype) { 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_UNDEFINED: 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_EMPTY: 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_NOT_EMPTY, 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s was declared EMPTY this one has content\n", 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, NULL, NULL); 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ANY: 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* I don't think anything is required then */ 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_MIXED: 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* simple case of declared as #PCDATA */ 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl->content != NULL) && 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (elemDecl->content->type == 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ELEMENT_CONTENT_PCDATA)) { 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_NOT_PCDATA, 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s was declared #PCDATA but contains non text nodes\n", 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, NULL, NULL); 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateCheckMixed(ctxt, elemDecl->content, 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project qname); 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) { 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_INVALID_CHILD, 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is not declared in %s list of possible children\n", 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project qname, state->node->name, NULL); 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ELEMENT: 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * VC: Standalone Document Declaration 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - element types with element content, if white space 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurs directly within any instance of those types. 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->exec != NULL) { 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(state->exec, qname, NULL); 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_CONTENT_MODEL, 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s content does not follow the DTD, Misplaced %s\n", 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, qname, NULL); 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project eDecl = xmlValidGetElemDecl(ctxt, doc, elem, &extsubset); 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vstateVPush(ctxt, eDecl, elem); 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidatePushCData: 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: some character data read 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the lenght of the data 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the CData parsed for validation in the current stack 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidatePushCData(xmlValidCtxtPtr ctxt, const xmlChar *data, int len) { 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* printf("CDATA %s %d\n", data, len); */ 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len <= 0) 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidStatePtr state = ctxt->vstate; 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl; 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the new element agaisnt the content model of the new elem. 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->elemDecl != NULL) { 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = state->elemDecl; 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(elemDecl->etype) { 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_UNDEFINED: 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_EMPTY: 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_NOT_EMPTY, 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s was declared EMPTY this one has content\n", 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, NULL, NULL); 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ANY: 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_MIXED: 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ELEMENT: 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len > 0) { 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < len;i++) { 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_BLANK_CH(data[i])) { 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_CONTENT_MODEL, 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s content does not follow the DTD, Text not allowed\n", 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, NULL, NULL); 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * VC: Standalone Document Declaration 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element types with element content, if white space 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurs directly within any instance of those types. 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidatePopElement: 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @qname: the qualified name as appearing in the serialization 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the element end from the validation stack. 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidatePopElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED, 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem ATTRIBUTE_UNUSED, 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *qname ATTRIBUTE_UNUSED) { 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* printf("PopElem %s\n", qname); */ 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidStatePtr state = ctxt->vstate; 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl; 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the new element agaisnt the content model of the new elem. 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->elemDecl != NULL) { 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = state->elemDecl; 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT) { 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->exec != NULL) { 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushString(state->exec, NULL, NULL); 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, state->node, 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_CONTENT_MODEL, 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s content does not follow the DTD, Expecting more child\n", 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->node->name, NULL,NULL); 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * previous validation errors should not generate 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a new one here 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vstateVPop(ctxt); 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateOneElement: 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a single element and it's attributes, 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks as described by the 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Element Valid ] 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Required Attribute ] 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then call xmlValidateOneAttribute() for each attribute present. 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ID/IDREF checkings are done separately 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateOneElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem) { 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elemDecl = NULL; 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementContentPtr cont; 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributePtr attr; 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1, tmp; 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int extsubset = 0; 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_DTD; 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(0); 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (elem->type) { 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute element not expected\n", NULL, NULL ,NULL); 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->children != NULL) { 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Text element has children !\n", 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL,NULL,NULL); 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->ns != NULL) { 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Text element has namespace !\n", 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL,NULL,NULL); 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->content == NULL) { 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Text element has no content !\n", 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL,NULL,NULL); 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Entity element not expected\n", NULL, NULL ,NULL); 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Notation element not expected\n", NULL, NULL ,NULL); 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Document element not expected\n", NULL, NULL ,NULL); 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HTML Document not expected\n", NULL, NULL ,NULL); 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "unknown element type\n", NULL, NULL ,NULL); 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fetch the declaration 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elemDecl = xmlValidGetElemDecl(ctxt, doc, elem, &extsubset); 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elemDecl == NULL) 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If vstateNr is not zero that means continuous validation is 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated, do not try to check the content model at that level. 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vstateNr == 0) { 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Check that the element content matches the definition */ 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (elemDecl->etype) { 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_UNDEFINED: 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ELEM, 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "No declaration for element %s\n", 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_EMPTY: 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->children != NULL) { 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_NOT_EMPTY, 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s was declared EMPTY this one has content\n", 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ANY: 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* I don't think anything is required then */ 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_MIXED: 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* simple case of declared as #PCDATA */ 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elemDecl->content != NULL) && 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (elemDecl->content->type == XML_ELEMENT_CONTENT_PCDATA)) { 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateOneCdataElement(ctxt, doc, elem); 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!ret) { 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_NOT_PCDATA, 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s was declared #PCDATA but contains non text nodes\n", 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hum, this start to get messy */ 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_ELEMENT_NODE) { 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = child->name; 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((child->ns != NULL) && (child->ns->prefix != NULL)) { 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(child->name, child->ns->prefix, 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fn, 50); 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = elemDecl->content; 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cont != NULL) { 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cont->name, fullname)) 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 != NULL) && 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cont->c1->name, fullname)) 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 == NULL) || 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(NULL, XML_DTD_MIXED_CORRUPT, 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: MIXED struct corrupted\n", 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = cont->c2; 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != child->name)) 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cont != NULL) 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto child_ok; 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = elemDecl->content; 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cont != NULL) { 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cont->name, name)) break; 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 != NULL) && 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)) { 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cont->c1->name, name)) break; 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1 == NULL) || 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)) { 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_MIXED_CORRUPT, 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal: MIXED struct corrupted\n", 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = cont->c2; 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cont == NULL) { 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_CHILD, 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s is not declared in %s list of possible children\n", 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, elem->name, NULL); 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectchild_ok: 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_TYPE_ELEMENT: 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->standalone == 1) && (extsubset == 1)) { 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * VC: Standalone Document Declaration 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - element types with element content, if white space 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurs directly within any instance of those types. 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (child->type == XML_TEXT_NODE) { 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *content = child->content; 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*content)) 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content++; 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*content == 0) { 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_STANDALONE_WHITE_SPACE, 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"standalone: %s declared in the external subset contains white spaces nodes\n", 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child =child->next; 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cont = elemDecl->content; 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlValidateElementContent(ctxt, child, elemDecl, 1, elem); 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp <= 0) 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = tmp; 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } /* not continuous */ 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* [ VC: Required Attribute ] */ 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = elemDecl->attributes; 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->def == XML_ATTRIBUTE_REQUIRED) { 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int qualified = -1; 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->prefix == NULL) && 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) { 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = elem->nsDef; 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ns != NULL) { 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix == NULL) 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ns->next; 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(attr->prefix, BAD_CAST "xmlns")) { 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = elem->nsDef; 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ns != NULL) { 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(attr->name, ns->prefix)) 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ns->next; 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attrib; 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrib = elem->properties; 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attrib != NULL) { 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(attrib->name, attr->name)) { 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->prefix != NULL) { 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr nameSpace = attrib->ns; 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nameSpace == NULL) 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nameSpace = elem->ns; 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * qualified names handling is problematic, having a 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * different prefix should be possible but DTDs don't 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allow to define the URI instead of the prefix :-( 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nameSpace == NULL) { 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (qualified < 0) 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project qualified = 0; 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrEqual(nameSpace->prefix, 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->prefix)) { 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (qualified < 1) 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project qualified = 1; 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should allow applications to define namespaces 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their application even if the DTD doesn't 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * carry one, otherwise, basically we would always 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * break. 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrib = attrib->next; 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (qualified == -1) { 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->prefix == NULL) { 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_MISSING_ATTRIBUTE, 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s does not carry attribute %s\n", 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->name, NULL); 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_MISSING_ATTRIBUTE, 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s does not carry attribute %s:%s\n", 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->prefix,attr->name); 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (qualified == 0) { 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidWarning(ctxt, elem, XML_DTD_NO_PREFIX, 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s required attribute %s:%s has no prefix\n", 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->prefix, attr->name); 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (qualified == 1) { 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidWarning(ctxt, elem, XML_DTD_DIFFERENT_PREFIX, 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s required attribute %s:%s has different prefix\n", 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, attr->prefix, attr->name); 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (attr->def == XML_ATTRIBUTE_FIXED) { 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Special tests checking #FIXED namespace declarations 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have the right value since this is not done as an 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * attribute checking 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->prefix == NULL) && 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) { 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = elem->nsDef; 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ns != NULL) { 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix == NULL) { 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(attr->defaultValue, ns->href)) { 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_DTD_ELEM_DEFAULT_NAMESPACE, 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s namespace name for default namespace does not match the DTD\n", 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, NULL, NULL); 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ns->next; 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(attr->prefix, BAD_CAST "xmlns")) { 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = elem->nsDef; 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ns != NULL) { 6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(attr->name, ns->prefix)) { 6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(attr->defaultValue, ns->href)) { 6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, 6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s namespace name for %s does not match the DTD\n", 6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->name, ns->prefix, NULL); 6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ns->next; 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound: 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->nexth; 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateRoot: 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate a the root element 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following check as described by the 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML-1.0 recommendation: 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - [ VC: Root Element Type ] 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it doesn't try to recurse or apply other check to the element 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateRoot(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(0); 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((root == NULL) || (root->name == NULL)) { 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_NO_ROOT, 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "no root element\n", NULL); 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When doing post validation against a separate DTD, those may 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * no internal subset has been generated 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset != NULL) && 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (doc->intSubset->name != NULL)) { 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check first the document root against the NQName 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(doc->intSubset->name, root->name)) { 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((root->ns != NULL) && (root->ns->prefix != NULL)) { 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar fn[50]; 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(root->name, root->ns->prefix, fn, 50); 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) { 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, NULL); 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(doc->intSubset->name, fullname); 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((fullname != fn) && (fullname != root->name)) 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(fullname); 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto name_ok; 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(doc->intSubset->name, BAD_CAST "HTML")) && 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(root->name, BAD_CAST "html"))) 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto name_ok; 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, root, XML_DTD_ROOT_NAME, 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "root and DTD name do not match '%s' and '%s'\n", 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root->name, doc->intSubset->name, NULL); 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectname_ok: 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateElement: 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: an element instance 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate the subtree under an element 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem) { 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child; 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value; 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(0); 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XInclude elements were added after parsing in the infoset, 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they don't really mean anything validation wise. 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem->type == XML_XINCLUDE_START) || 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (elem->type == XML_XINCLUDE_END)) 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_DTD; 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Entities references have to be handled separately 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->type == XML_ENTITY_REF_NODE) { 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateOneElement(ctxt, doc, elem); 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->type == XML_ELEMENT_NODE) { 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = elem->properties; 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = xmlNodeListGetString(doc, attr->children, 0); 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value); 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value != NULL) 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *)value); 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr= attr->next; 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = elem->nsDef; 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ns != NULL) { 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->ns == NULL) 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateOneNamespace(ctxt, doc, elem, NULL, 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns, ns->href); 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateOneNamespace(ctxt, doc, elem, 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem->ns->prefix, ns, ns->href); 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ns->next; 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateElement(ctxt, doc, child); 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateRef: 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ref: A reference to be validated 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: Validation context 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: Name of ID we are searching for 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt, 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name) { 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr id; 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref == NULL) 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ref->attr == NULL) && (ref->name == NULL)) 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = ref->attr; 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr == NULL) { 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *dup, *str = NULL, *cur, save; 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dup = xmlStrdup(name); 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dup == NULL) { 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = dup; 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = cur; 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project save = *cur; 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = 0; 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlGetID(ctxt->doc, str); 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL) { 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNodeNr(ctxt, NULL, XML_DTD_UNKNOWN_ID, 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "attribute %s line %d references an unknown ID \"%s\"\n", 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ref->name, ref->lineno, str); 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (save == 0) 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = save; 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(dup); 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (attr->atype == XML_ATTRIBUTE_IDREF) { 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlGetID(ctxt->doc, name); 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL) { 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "IDREF attribute %s references an unknown ID \"%s\"\n", 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, name, NULL); 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (attr->atype == XML_ATTRIBUTE_IDREFS) { 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *dup, *str = NULL, *cur, save; 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dup = xmlStrdup(name); 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dup == NULL) { 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlVErrMemory(ctxt, "IDREFS split"); 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = dup; 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = cur; 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project save = *cur; 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = 0; 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlGetID(ctxt->doc, str); 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL) { 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "IDREFS attribute %s references an unknown ID \"%s\"\n", 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->name, str, NULL); 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (save == 0) 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cur = save; 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(dup); 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlWalkValidateList: 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: Contents of current link 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user: Value supplied by the user 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 to abort the walk or 1 to continue 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlWalkValidateList(const void *data, const void *user) 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidateMemoPtr memo = (xmlValidateMemoPtr)user; 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidateRef((xmlRefPtr)data, memo->ctxt, memo->name); 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 1; 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateCheckRefCallback: 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ref_list: List of references 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: Validation context 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: Name of ID we are searching for 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateCheckRefCallback(xmlListPtr ref_list, xmlValidCtxtPtr ctxt, 6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name) { 6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidateMemo memo; 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ref_list == NULL) 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memo.ctxt = ctxt; 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memo.name = name; 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListWalk(ref_list, xmlWalkValidateList, &memo); 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateDocumentFinal: 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Does the final step for the document validation once all the 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * incremental validation steps have been completed 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks described by the XML Rec 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the IDREF/IDREFS attributes definition for validity 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRefTablePtr table; 6562df143a5041f03a22808b59c76698770b74692815Selim Gurun unsigned int save; 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_NO_DOC, 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlValidateDocumentFinal: doc == NULL\n", NULL); 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6572df143a5041f03a22808b59c76698770b74692815Selim Gurun /* trick to get correct line id report */ 6573df143a5041f03a22808b59c76698770b74692815Selim Gurun save = ctxt->finishDtd; 6574df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->finishDtd = 0; 6575df143a5041f03a22808b59c76698770b74692815Selim Gurun 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the NOTATION/NOTATIONS attributes 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the ENTITY/ENTITIES attributes definition for validity 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the IDREF/IDREFS attributes definition for validity 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlRefTablePtr) doc->refs; 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = doc; 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 1; 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner) xmlValidateCheckRefCallback, ctxt); 6589df143a5041f03a22808b59c76698770b74692815Selim Gurun 6590df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->finishDtd = save; 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->valid); 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateDtd: 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dtd: a dtd instance 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate the document against the dtd instance 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Basically it does check all the definitions in the DtD. 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note the the internal subset (if present) is de-coupled 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (i.e. not used), which could give problems if ID or IDREF 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is present. 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateDtd(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlDtdPtr dtd) { 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr oldExt, oldInt; 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) return(0); 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) return(0); 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldExt = doc->extSubset; 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldInt = doc->intSubset; 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->extSubset = dtd; 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->intSubset = NULL; 6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateRoot(ctxt, doc); 6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->extSubset = oldExt; 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->intSubset = oldInt; 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->ids != NULL) { 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeIDTable(doc->ids); 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->ids = NULL; 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->refs != NULL) { 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeRefTable(doc->refs); 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->refs = NULL; 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateElement(ctxt, doc, root); 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateDocumentFinal(ctxt, doc); 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->extSubset = oldExt; 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->intSubset = oldInt; 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateNotationCallback(xmlEntityPtr cur, xmlValidCtxtPtr ctxt, 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name ATTRIBUTE_UNUSED) { 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *notation = cur->content; 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (notation != NULL) { 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateNotationUse(ctxt, cur->doc, notation); 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 1) { 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateAttributeCallback(xmlAttributePtr cur, xmlValidCtxtPtr ctxt, 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name ATTRIBUTE_UNUSED) { 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElementPtr elem = NULL; 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->atype) { 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_CDATA: 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ID: 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREF : 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_IDREFS: 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKEN: 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NMTOKENS: 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENUMERATION: 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITY: 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_ENTITIES: 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NOTATION: 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->defaultValue != NULL) { 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, cur->name, 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->atype, cur->defaultValue); 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->valid == 1)) 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->tree != NULL) { 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEnumerationPtr tree = cur->tree; 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tree != NULL) { 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, cur->atype, tree->name); 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 0) && (ctxt->valid == 1)) 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tree = tree->next; 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->atype == XML_ATTRIBUTE_NOTATION) { 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = cur->doc; 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->elem == NULL) { 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlValidateAttributeCallback(%s): internal error\n", 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) cur->name); 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = xmlGetDtdElementDesc(doc->intSubset, cur->elem); 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem == NULL) && (doc != NULL)) 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = xmlGetDtdElementDesc(doc->extSubset, cur->elem); 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((elem == NULL) && (cur->parent != NULL) && 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->type == XML_DTD_NODE)) 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = xmlGetDtdElementDesc((xmlDtdPtr) cur->parent, cur->elem); 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) { 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, NULL, XML_DTD_UNKNOWN_ELEM, 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "attribute %s: could not find decl for element %s\n", 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, cur->elem, NULL); 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem->etype == XML_ELEMENT_TYPE_EMPTY) { 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValidNode(ctxt, NULL, XML_DTD_EMPTY_NOTATION, 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NOTATION attribute %s declared for EMPTY element %s\n", 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, cur->elem, NULL); 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 0; 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateDtdFinal: 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Does the final step for the dtds validation once all the 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subsets have been parsed 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the following checks described by the XML Rec 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - check that ENTITY and ENTITIES type attributes default or 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible values matches one of the defined entities. 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - check that NOTATION type attributes default or 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible values matches one of the defined notations. 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 if invalid and -1 if not well-formed 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateDtdFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd; 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttributeTablePtr table; 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesTablePtr entities; 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 675660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((doc == NULL) || (ctxt == NULL)) return(0); 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->doc = doc; 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 1; 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = doc->intSubset; 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd != NULL) && (dtd->attributes != NULL)) { 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlAttributeTablePtr) dtd->attributes; 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner) xmlValidateAttributeCallback, ctxt); 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd != NULL) && (dtd->entities != NULL)) { 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entities = (xmlEntitiesTablePtr) dtd->entities; 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(entities, (xmlHashScanner) xmlValidateNotationCallback, 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = doc->extSubset; 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd != NULL) && (dtd->attributes != NULL)) { 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlAttributeTablePtr) dtd->attributes; 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner) xmlValidateAttributeCallback, ctxt); 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dtd != NULL) && (dtd->entities != NULL)) { 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entities = (xmlEntitiesTablePtr) dtd->entities; 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(entities, (xmlHashScanner) xmlValidateNotationCallback, 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt); 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->valid); 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidateDocument: 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a document instance 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to validate the document instance 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * basically it does the all the checks described by the XML Rec 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * i.e. validates the internal and external subset (if present) 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and validate the document tree. 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if valid or 0 otherwise 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidateDocument(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root; 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_NO_DTD, 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "no DTD found!\n", NULL); 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset != NULL) && ((doc->intSubset->SystemID != NULL) || 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (doc->intSubset->ExternalID != NULL)) && (doc->extSubset == NULL)) { 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *sysID; 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->intSubset->SystemID != NULL) { 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sysID = xmlBuildURI(doc->intSubset->SystemID, 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->URL); 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sysID == NULL) { 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not build URI for external subset \"%s\"\n", 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) doc->intSubset->SystemID); 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0; 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sysID = NULL; 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->extSubset = xmlParseDTD(doc->intSubset->ExternalID, 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *)sysID); 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sysID != NULL) 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(sysID); 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->extSubset == NULL) { 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->intSubset->SystemID != NULL) { 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not load the external subset \"%s\"\n", 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) doc->intSubset->SystemID); 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Could not load the external subset \"%s\"\n", 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) doc->intSubset->ExternalID); 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->ids != NULL) { 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeIDTable(doc->ids); 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->ids = NULL; 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->refs != NULL) { 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeRefTable(doc->refs); 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->refs = NULL; 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlValidateDtdFinal(ctxt, doc); 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlValidateRoot(ctxt, doc)) return(0); 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateElement(ctxt, doc, root); 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret &= xmlValidateDocumentFinal(ctxt, doc); 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines for dynamic validation editing * 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidGetPotentialChildren: 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctree: an element content tree 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @names: an array to store the list of child names 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: a pointer to the number of element in the list 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the size of the array 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build/extend a list of potential children allowed by the content tree 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the number of element in the list, or -1 in case of error. 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidGetPotentialChildren(xmlElementContent *ctree, 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **names, 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *len, int max) { 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctree == NULL) || (names == NULL) || (len == NULL)) 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*len >= max) return(*len); 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctree->type) { 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_PCDATA: 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < *len;i++) 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(BAD_CAST "#PCDATA", names[i])) return(*len); 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project names[(*len)++] = BAD_CAST "#PCDATA"; 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_ELEMENT: 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < *len;i++) 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctree->name, names[i])) return(*len); 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project names[(*len)++] = ctree->name; 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_SEQ: 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidGetPotentialChildren(ctree->c1, names, len, max); 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidGetPotentialChildren(ctree->c2, names, len, max); 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_CONTENT_OR: 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidGetPotentialChildren(ctree->c1, names, len, max); 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidGetPotentialChildren(ctree->c2, names, len, max); 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(*len); 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dummy function to suppress messages while we try out valid elements 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL xmlNoValidityErr(void *ctx ATTRIBUTE_UNUSED, 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg ATTRIBUTE_UNUSED, ...) { 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlValidGetValidElements: 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prev: an element to insert after 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @next: an element to insert next 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @names: an array to store the list of child names 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the size of the array 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function returns the list of authorized children to insert 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * within an existing tree while respecting the validity constraints 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * forced by the Dtd. The insertion point is defined using @prev and 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @next in the following ways: 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to insert before 'node': xmlValidGetValidElements(node->prev, node, ... 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to insert next 'node': xmlValidGetValidElements(node, node->next, ... 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to replace 'node': xmlValidGetValidElements(node->prev, node->next, ... 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to prepend a child to 'node': xmlValidGetValidElements(NULL, node->childs, 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to append a child to 'node': xmlValidGetValidElements(node->last, NULL, ... 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pointers to the element names are inserted at the beginning of the array 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and do not need to be freed. 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the number of element in the list, or -1 in case of error. If 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the function returns the value @max the caller is invited to grow the 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * receiving array and retry. 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlValidGetValidElements(xmlNode *prev, xmlNode *next, const xmlChar **names, 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max) { 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlValidCtxt vctxt; 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_valid_elements = 0; 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *elements[256]; 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_elements = 0, i; 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *ref_node; 6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *parent; 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *test_node; 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *prev_next; 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *next_prev; 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *parent_childs; 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNode *parent_last; 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlElement *element_desc; 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev == NULL && next == NULL) 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (names == NULL) return(-1); 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max <= 0) return(-1); 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&vctxt, 0, sizeof (xmlValidCtxt)); 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt.error = xmlNoValidityErr; /* this suppresses err/warn output */ 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_valid_elements = 0; 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ref_node = prev ? prev : next; 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent = ref_node->parent; 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Retrieves the parent element declaration 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project element_desc = xmlGetDtdElementDesc(parent->doc->intSubset, 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->name); 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((element_desc == NULL) && (parent->doc->extSubset != NULL)) 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project element_desc = xmlGetDtdElementDesc(parent->doc->extSubset, 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->name); 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (element_desc == NULL) return(-1); 6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do a backup of the current tree structure 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev_next = prev ? prev->next : NULL; 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next_prev = next ? next->prev : NULL; 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent_childs = parent->children; 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent_last = parent->last; 6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a dummy node and insert it into the tree 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test_node = xmlNewDocNode (ref_node->doc, NULL, BAD_CAST "<!dummy?>", NULL); 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test_node->parent = parent; 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test_node->prev = prev; 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test_node->next = next; 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = test_node->name; 7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev) prev->next = test_node; 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else parent->children = test_node; 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next) next->prev = test_node; 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else parent->last = test_node; 7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Insert each potential child node and check if the parent is 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still valid 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_elements = xmlValidGetPotentialChildren(element_desc->content, 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elements, &nb_elements, 256); 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nb_elements;i++) { 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test_node->name = elements[i]; 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlValidateOneElement(&vctxt, parent->doc, parent)) { 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j; 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < nb_valid_elements;j++) 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(elements[i], names[j])) break; 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project names[nb_valid_elements++] = elements[i]; 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nb_valid_elements >= max) break; 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Restore the tree structure 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev) prev->next = prev_next; 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next) next->prev = next_prev; 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->children = parent_childs; 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent->last = parent_last; 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the dummy node 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test_node->name = name; 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNode(test_node); 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nb_valid_elements); 7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */ 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_valid 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 7049