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