1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xpointer.c : Code to handle XML Pointer
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Base implementation was made accordingly to
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * W3C Candidate Recommendation 7 June 2000
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/2000/CR-xptr-20000607
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Added support for the element() scheme described in:
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * W3C Proposed Recommendation 13 November 2002
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/2002/PR-xptr-element-20021113/
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: better handling of error cases, the full expression should
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       be parsed beforehand instead of a progressive evaluation
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Access into entities references are not supported now ...
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       need a start to be able to pop out of entities refs since
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       parent is the endity declaration, not the ref.
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpointer.h>
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpath.h>
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpathInternals.h>
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h>
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h>
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Add support of the xmlns() xpointer scheme to initialize the namespaces */
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPTR_XMLNS_SCHEME
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_RANGES */
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/debugXML.h>
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO 								\
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define STRANGE 							\
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error at %s:%d\n",				\
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Some factorized error routines				*
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrErrMemory:
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrErrMemory(const char *extra)
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPOINTER,
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra,
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL, 0, 0,
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Memory allocation failed : %s\n", extra);
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrErr:
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPTR evaluation context
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrErr(xmlXPathParserContextPtr ctxt, int error,
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           const char * msg, const xmlChar *extra)
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL)
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->error = error;
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) {
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, XML_FROM_XPOINTER, error,
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const char *) extra, NULL, NULL, 0, 0,
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			msg, extra);
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.domain = XML_FROM_XPOINTER;
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.code = error;
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.level = XML_ERR_ERROR;
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base);
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.int1 = ctxt->cur - ctxt->base;
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.node = ctxt->context->debugNode;
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->error != NULL) {
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->error(ctxt->context->userData,
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     &ctxt->context->lastError);
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, ctxt->context->debugNode, XML_FROM_XPOINTER,
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error, XML_ERR_ERROR, NULL, 0,
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const char *) extra, (const char *) ctxt->base, NULL,
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->cur - ctxt->base, 0,
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			msg, extra);
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		A few helper functions for child sequences		*
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* xmlXPtrAdvanceNode is a private function, but used by xinclude.c */
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level);
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetArity:
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the node
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of child for an element, -1 in case of error
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetArity(xmlNodePtr cur) {
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->children;
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;cur != NULL;cur = cur->next) {
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) ||
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type == XML_DOCUMENT_NODE) ||
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type == XML_HTML_DOCUMENT_NODE)) {
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i++;
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(i);
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetIndex:
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the node
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the index of the node in its parent children list, -1
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetIndex(xmlNodePtr cur) {
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1;cur != NULL;cur = cur->prev) {
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) ||
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type == XML_DOCUMENT_NODE) ||
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type == XML_HTML_DOCUMENT_NODE)) {
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i++;
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(i);
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetNthChild:
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the node
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @no:  the child number
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the @no'th element child of @cur or NULL
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetNthChild(xmlNodePtr cur, int no) {
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(cur);
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->children;
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i <= no;cur = cur->next) {
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL)
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur);
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) ||
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type == XML_DOCUMENT_NODE) ||
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type == XML_HTML_DOCUMENT_NODE)) {
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i++;
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i == no)
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Handling of XPointer specific types			*
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrCmpPoints:
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1:  the first node
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @index1:  the first index
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2:  the second node
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @index2:  the second index
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two points w.r.t document order
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         that's the same point, -1 otherwise
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrCmpPoints(xmlNodePtr node1, int index1, xmlNodePtr node2, int index2) {
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1 == NULL) || (node2 == NULL))
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a couple of optimizations which will avoid computations in most cases
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2) {
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (index1 < index2)
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (index1 > index2)
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCmpNodes(node1, node2));
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewPoint:
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the xmlNodePtr
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @indx:  the indx within the node
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type point
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewPoint(xmlNodePtr node, int indx) {
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (indx < 0)
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating point");
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_POINT;
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = (void *) node;
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = indx;
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrRangeCheckOrder:
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range:  an object range
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Make sure the points in the range are in the right order
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrRangeCheckOrder(xmlXPathObjectPtr range) {
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp2;
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range == NULL)
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range->type != XPATH_RANGE)
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range->user2 == NULL)
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = xmlXPtrCmpPoints(range->user, range->index,
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     range->user2, range->index2);
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tmp == -1) {
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp2 = range->user;
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range->user = range->user2;
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range->user2 = tmp2;
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = range->index;
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range->index = range->index2;
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range->index2 = tmp;
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrRangesEqual:
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range1:  the first range
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range2:  the second range
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two ranges
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equal, 0 otherwise
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) {
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1 == range2)
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((range1 == NULL) || (range2 == NULL))
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->type != range2->type)
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->type != XPATH_RANGE)
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->user != range2->user)
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->index != range2->index)
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->user2 != range2->user2)
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->index2 != range2->index2)
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewRange:
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting node
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @startindex:  the start index
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the ending point
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @endindex:  the ending index
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewRange(xmlNodePtr start, int startindex,
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlNodePtr end, int endindex) {
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (startindex < 0)
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (endindex < 0)
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start;
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = startindex;
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user2 = end;
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index2 = endindex;
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrRangeCheckOrder(ret);
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewRangePoints:
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting point
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the ending point
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range using 2 Points
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) {
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start->type != XPATH_POINT)
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end->type != XPATH_POINT)
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start->user;
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = start->index;
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user2 = end->user;
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index2 = end->index;
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrRangeCheckOrder(ret);
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewRangePointNode:
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting point
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the ending node
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range from a point to a node
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) {
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start->type != XPATH_POINT)
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start->user;
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = start->index;
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user2 = end;
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index2 = -1;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrRangeCheckOrder(ret);
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewRangeNodePoint:
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting node
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the ending point
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range from a node to a point
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) {
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start->type != XPATH_POINT)
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end->type != XPATH_POINT)
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start;
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = -1;
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user2 = end->user;
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index2 = end->index;
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrRangeCheckOrder(ret);
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewRangeNodes:
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting node
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the ending node
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range using 2 nodes
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) {
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start;
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = -1;
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user2 = end;
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index2 = -1;
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrRangeCheckOrder(ret);
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewCollapsedRange:
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting and ending node
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range using a single nodes
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewCollapsedRange(xmlNodePtr start) {
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start;
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = -1;
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user2 = NULL;
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index2 = -1;
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewRangeNodeObject:
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the starting node
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the ending object
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type range from a not to an object
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) {
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (end->type) {
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Empty set ...
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end->nodesetval->nodeNr <= 0)
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO */
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating range");
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_RANGE;
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = start;
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->index = -1;
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (end->type) {
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user2 = end->user;
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->index2 = end->index;
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user2 = end->user2;
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->index2 = end->index2;
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET: {
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1];
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->index2 = -1;
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrRangeCheckOrder(ret);
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RANGESET_DEFAULT	10
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrLocationSetCreate:
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an initial xmlXPathObjectPtr, or NULL
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlLocationSetPtr of type double and of value @val
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLocationSetPtr
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrLocationSetCreate(xmlXPathObjectPtr val) {
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr ret;
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlLocationSetPtr) xmlMalloc(sizeof(xmlLocationSet));
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating locationset");
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlLocationSet));
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL) {
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->locTab = (xmlXPathObjectPtr *) xmlMalloc(XML_RANGESET_DEFAULT *
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlXPathObjectPtr));
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->locTab == NULL) {
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrErrMemory("allocating locationset");
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(ret->locTab, 0 ,
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_RANGESET_DEFAULT * (size_t) sizeof(xmlXPathObjectPtr));
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->locMax = XML_RANGESET_DEFAULT;
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->locTab[ret->locNr++] = val;
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrLocationSetAdd:
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial range set
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a new xmlXPathObjectPtr
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlXPathObjectPtr to an existing LocationSet
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the location already exist in the set @val is freed.
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrLocationSetAdd(xmlLocationSetPtr cur, xmlXPathObjectPtr val) {
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return;
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check against doublons
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->locNr;i++) {
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPtrRangesEqual(cur->locTab[i], val)) {
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeObject(val);
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the locTab if needed
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->locMax == 0) {
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->locTab = (xmlXPathObjectPtr *) xmlMalloc(XML_RANGESET_DEFAULT *
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlXPathObjectPtr));
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->locTab == NULL) {
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrErrMemory("adding location to set");
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->locTab, 0 ,
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_RANGESET_DEFAULT * (size_t) sizeof(xmlXPathObjectPtr));
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->locMax = XML_RANGESET_DEFAULT;
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->locNr == cur->locMax) {
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathObjectPtr *temp;
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->locMax *= 2;
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (xmlXPathObjectPtr *) xmlRealloc(cur->locTab, cur->locMax *
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlXPathObjectPtr));
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrErrMemory("adding location to set");
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->locTab = temp;
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->locTab[cur->locNr++] = val;
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrLocationSetMerge:
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1:  the first LocationSet
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2:  the second LocationSet
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two rangesets, all ranges from @val2 are added to @val1
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns val1 once extended or NULL in case of error.
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLocationSetPtr
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrLocationSetMerge(xmlLocationSetPtr val1, xmlLocationSetPtr val2) {
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val1 == NULL) return(NULL);
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val2 == NULL) return(val1);
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * !!!!! this can be optimized a lot, knowing that both
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *       val1 and val2 already have unicity of their values.
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < val2->locNr;i++)
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrLocationSetAdd(val1, val2->locTab[i]);
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val1);
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrLocationSetDel:
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial range set
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an xmlXPathObjectPtr
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an xmlXPathObjectPtr from an existing LocationSet
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrLocationSetDel(xmlLocationSetPtr cur, xmlXPathObjectPtr val) {
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return;
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) return;
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check against doublons
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->locNr;i++)
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->locTab[i] == val) break;
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (i >= cur->locNr) {
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        "xmlXPtrLocationSetDel: Range wasn't found in RangeList\n");
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->locNr--;
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (;i < cur->locNr;i++)
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->locTab[i] = cur->locTab[i + 1];
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->locTab[cur->locNr] = NULL;
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrLocationSetRemove:
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial range set
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the index to remove
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an entry from an existing LocationSet list.
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrLocationSetRemove(xmlLocationSetPtr cur, int val) {
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return;
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val >= cur->locNr) return;
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->locNr--;
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (;val < cur->locNr;val++)
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->locTab[val] = cur->locTab[val + 1];
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->locTab[cur->locNr] = NULL;
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrFreeLocationSet:
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlLocationSetPtr to free
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the LocationSet compound (not the actual ranges !).
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrFreeLocationSet(xmlLocationSetPtr obj) {
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->locTab != NULL) {
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < obj->locNr; i++) {
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathFreeObject(obj->locTab[i]);
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj->locTab);
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewLocationSetNodes:
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the start NodePtr value
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the end NodePtr value or NULL
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type LocationSet and initialize
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single range made of the two nodes @start and @end
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewLocationSetNodes(xmlNodePtr start, xmlNodePtr end) {
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating locationset");
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_LOCATIONSET;
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user = xmlXPtrLocationSetCreate(xmlXPtrNewCollapsedRange(start));
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user = xmlXPtrLocationSetCreate(xmlXPtrNewRangeNodes(start,end));
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewLocationSetNodeSet:
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set:  a node set
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type LocationSet and initialize
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with all the nodes from @set
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set) {
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating locationset");
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_LOCATIONSET;
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set != NULL) {
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlLocationSetPtr newset;
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newset = xmlXPtrLocationSetCreate(NULL);
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (newset == NULL)
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < set->nodeNr;i++)
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrLocationSetAdd(newset,
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlXPtrNewCollapsedRange(set->nodeTab[i]));
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user = (void *) newset;
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrWrapLocationSet:
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the LocationSet value
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the LocationSet @val in a new xmlXPathObjectPtr
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrWrapLocationSet(xmlLocationSetPtr val) {
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating locationset");
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_LOCATIONSET;
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = (void *) val;
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			The parser					*
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name);
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macros for accessing the content. Those should be used only by the parser,
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and not exported.
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dirty macros, i.e. one need to make assumption on the context to use them
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CUR_PTR return the current pointer to the xmlChar to be parsed.
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CUR     returns the current xmlChar value, i.e. a 8 bit value
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           in ISO-Latin or UTF-8.
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           This should be used internally by the parser
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           only to compare to ASCII values otherwise it would break when
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           running with UTF-8 encoding.
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   NXT(n)  returns the n'th next xmlChar. Same as CUR is should be used only
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           to compare on ASCII based substring.
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           strings within the parser.
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CURRENT Returns the current char value, with the full decoding of
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           UTF-8 if we are using this mode. It returns an int.
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   NEXT    Skip to the next character, this does the proper decoding
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           in UTF-8 mode. It also pop-up unfinished entities on the fly.
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           It returns the pointer to the current xmlChar.
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur)
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->cur += (val)
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->cur[(val)]
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->cur
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS 							\
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*(ctxt->cur))) NEXT
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT (*ctxt->cur)
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ((*ctxt->cur) ?  ctxt->cur++: ctxt->cur)
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetChildNo:
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @index:  the child number
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Move the current node of the nodeset on the stack to the
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * given child if found
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int indx) {
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur = NULL;
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr oldset;
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NODESET);
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = obj->nodesetval;
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((indx <= 0) || (oldset == NULL) || (oldset->nodeNr != 1)) {
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(obj);
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathNewNodeSet(NULL));
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlXPtrGetNthChild(oldset->nodeTab[0], indx);
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(obj);
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathNewNodeSet(NULL));
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset->nodeTab[0] = cur;
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, obj);
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEvalXPtrPart:
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the preparsed Scheme for the XPtrPart
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPtrPart ::= 'xpointer' '(' XPtrExpr ')'
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            | Scheme '(' SchemeSpecificExpr ')'
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Scheme   ::=  NCName - 'xpointer' [VC: Non-XPointer schemes]
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SchemeSpecificExpr ::= StringWithBalancedParens
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * StringWithBalancedParens ::=
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *              [^()]* ('(' StringWithBalancedParens ')' [^()]*)*
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *              [VC: Parenthesis escaping]
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPtrExpr ::= Expr [VC: Parenthesis escaping]
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * VC: Parenthesis escaping:
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   The end of an XPointer part is signaled by the right parenthesis ")"
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   character that is balanced with the left parenthesis "(" character
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   that began the part. Any unbalanced parenthesis character inside the
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   expression, even within literals, must be escaped with a circumflex (^)
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   character preceding it. If the expression contains any literal
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   occurrences of the circumflex, each must be escaped with an additional
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   circumflex (that is, ^^). If the unescaped parentheses in the expression
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   are not balanced, a syntax error results.
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate an XPtrPart. Basically it generates the unescaped
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string and if the scheme is 'xpointer' it will call the XPath interpreter.
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: there is no new scheme registration mechanism
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) {
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *buffer, *cur;
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int level;
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlXPathParseName(ctxt);
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '(')
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    level = 1;
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = xmlStrlen(ctxt->cur);
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len++;
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buffer = (xmlChar *) xmlMallocAtomic(len * sizeof (xmlChar));
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buffer == NULL) {
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErrMemory("allocating buffer");
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = buffer;
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR != 0) {
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == ')') {
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    level--;
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (level == 0) {
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *cur++ = CUR;
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == '(') {
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    level++;
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *cur++ = CUR;
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == '^') {
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((CUR == ')') || (CUR == '(') || (CUR == '^')) {
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cur++ = CUR;
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cur++ = '^';
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cur++ = CUR;
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *cur++ = CUR;
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *cur = 0;
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((level != 0) && (CUR == 0)) {
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(buffer);
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPTR_SYNTAX_ERROR);
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, (xmlChar *) "xpointer")) {
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *left = CUR_PTR;
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CUR_PTR = buffer;
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * To evaluate an xpointer scheme element (4.3) we need:
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   context initialized to the root
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   context position initalized to 1
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   context size initialized to 1
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = (xmlNodePtr)ctxt->context->doc;
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = 1;
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = 1;
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathEvalExpr(ctxt);
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CUR_PTR=left;
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(name, (xmlChar *) "element")) {
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *left = CUR_PTR;
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *name2;
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CUR_PTR = buffer;
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffer[0] == '/') {
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRoot(ctxt);
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrEvalChildSeq(ctxt, NULL);
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name2 = xmlXPathParseName(ctxt);
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name2 == NULL) {
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CUR_PTR = left;
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(buffer);
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XP_ERROR(XPATH_EXPR_ERROR);
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrEvalChildSeq(ctxt, name2);
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CUR_PTR = left;
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPTR_XMLNS_SCHEME
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(name, (xmlChar *) "xmlns")) {
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *left = CUR_PTR;
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *prefix;
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *URI;
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlURIPtr value;
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CUR_PTR = buffer;
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        prefix = xmlXPathParseNCName(ctxt);
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prefix == NULL) {
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(buffer);
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPTR_SYNTAX_ERROR);
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != '=') {
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(buffer);
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPTR_SYNTAX_ERROR);
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* @@ check escaping in the XPointer WD */
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value = xmlParseURI((const char *)ctxt->cur);
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value == NULL) {
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(buffer);
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPTR_SYNTAX_ERROR);
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	URI = xmlSaveUri(value);
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeURI(value);
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (URI == NULL) {
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(buffer);
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_MEMORY_ERROR);
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathRegisterNs(ctxt->context, prefix, URI);
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CUR_PTR = left;
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(URI);
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(prefix);
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPTR_XMLNS_SCHEME */
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErr(ctxt, XML_XPTR_UNKNOWN_SCHEME,
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   "unsupported scheme '%s'\n", name);
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(buffer);
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(name);
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEvalFullXPtr:
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the preparsed Scheme for the first XPtrPart
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * FullXPtr ::= XPtrPart (S? XPtrPart)*
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * As the specs says:
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -----------
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When multiple XPtrParts are provided, they must be evaluated in
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * left-to-right order. If evaluation of one part fails, the nexti
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is evaluated. The following conditions cause XPointer part failure:
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - An unknown scheme
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - A scheme that does not locate any sub-resource present in the resource
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - A scheme that is not applicable to the media type of the resource
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The XPointer application must consume a failed XPointer part and
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * attempt to evaluate the next one, if any. The result of the first
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPointer part whose evaluation succeeds is taken to be the fragment
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * located by the XPointer as a whole. If all the parts fail, the result
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for the XPointer as a whole is a sub-resource error.
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -----------
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate a Full XPtr i.e. possibly a cascade of XPath based
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expressions or other schemes.
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEvalFullXPtr(xmlXPathParserContextPtr ctxt, xmlChar *name) {
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlXPathParseName(ctxt);
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (name != NULL) {
1155df143a5041f03a22808b59c76698770b74692815Selim Gurun	ctxt->error = XPATH_EXPRESSION_OK;
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrEvalXPtrPart(ctxt, name);
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* in case of syntax error, break here */
1159df143a5041f03a22808b59c76698770b74692815Selim Gurun	if ((ctxt->error != XPATH_EXPRESSION_OK) &&
1160df143a5041f03a22808b59c76698770b74692815Selim Gurun            (ctxt->error != XML_XPTR_UNKNOWN_SCHEME))
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * If the returned value is a non-empty nodeset
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * or location set, return here.
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value != NULL) {
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr obj = ctxt->value;
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (obj->type) {
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET: {
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlLocationSetPtr loc = ctxt->value->user;
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((loc != NULL) && (loc->locNr > 0))
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return;
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET: {
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodeSetPtr loc = ctxt->value->nodesetval;
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((loc != NULL) && (loc->nodeNr > 0))
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return;
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Evaluating to improper values is equivalent to
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * a sub-resource error, clean-up the stack
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		obj = valuePop(ctxt);
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj != NULL) {
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(obj);
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (obj != NULL);
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Is there another XPointer part.
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathParseName(ctxt);
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEvalChildSeq:
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  a possible ID name of the child sequence
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  ChildSeq ::= '/1' ('/' [0-9]*)*
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *             | Name ('/' [0-9]*)+
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate a Child Sequence. This routine also handle the
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of a Bare Name used to get a document ID.
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name) {
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * XPointer don't allow by syntax to address in mutirooted trees
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * this might prove useful in some cases, warn about it.
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) && (CUR == '/') && (NXT(1) != '1')) {
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErr(ctxt, XML_XPTR_CHILDSEQ_START,
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   "warning: ChildSeq not starting by /1\n", NULL);
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name != NULL) {
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathNewString(name));
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(name);
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathIdFunction(ctxt, 1);
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '/') {
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int child = 0;
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((CUR >= '0') && (CUR <= '9')) {
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child * 10 + (CUR - '0');
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrGetChildNo(ctxt, child);
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEvalXPointer:
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  XPointer ::= Name
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *             | ChildSeq
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *             | FullXPtr
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate an XPointer
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) {
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueTab == NULL) {
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Allocate the value stack */
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueTab = (xmlXPathObjectPtr *)
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlMalloc(10 * sizeof(xmlXPathObjectPtr));
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->valueTab == NULL) {
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrErrMemory("allocating evaluation context");
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueNr = 0;
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueMax = 10;
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value = NULL;
1272df143a5041f03a22808b59c76698770b74692815Selim Gurun	ctxt->valueFrame = 0;
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '/') {
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathRoot(ctxt);
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrEvalChildSeq(ctxt, NULL);
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *name;
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathParseName(ctxt);
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (name == NULL)
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_EXPR_ERROR);
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '(') {
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrEvalFullXPtr(ctxt, name);
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Short evaluation */
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* this handle both Bare Names and Child Sequences */
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrEvalChildSeq(ctxt, name);
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != 0)
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			General routines				*
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1305df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs);
1307df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs);
1309df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs);
1311df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs);
1313df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs);
1315df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs);
1317df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs);
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNewContext:
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the XML document
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @here:  the node that directly contains the XPointer being evaluated or NULL
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @origin:  the element from which a user or program initiated traversal of
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           the link, or NULL.
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new XPointer context
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathContext just allocated.
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextPtr
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNewContext(xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin) {
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextPtr ret;
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNewContext(doc);
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->xptr = 1;
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->here = here;
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->origin = origin;
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"range-to",
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrRangeToFunction);
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"range",
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrRangeFunction);
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"range-inside",
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrRangeInsideFunction);
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"string-range",
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrStringRangeFunction);
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"start-point",
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrStartPointFunction);
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"end-point",
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrEndPointFunction);
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)"here",
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrHereFunction);
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ret, (xmlChar *)" origin",
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlXPtrOriginFunction);
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEval:
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPointer expression
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  the XPointer context
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath Location Path in the given context.
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) {
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ctxt;
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res = NULL, tmp;
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr init = NULL;
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stack = 0;
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctx == NULL) || (str == NULL))
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt = xmlXPathNewParserContext(str, ctx);
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->xptr = 1;
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPtrEvalXPointer(ctxt);
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value != NULL) &&
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->value->type != XPATH_NODESET) &&
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->value->type != XPATH_LOCATIONSET)) {
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErr(ctxt, XML_XPTR_EVAL_FAILED,
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPtrEval: evaluation failed to return a node set\n",
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   NULL);
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(ctxt);
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = valuePop(ctxt);
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != init) {
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp->type == XPATH_NODESET) {
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * Evaluation may push a root nodeset which is unused
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodeSetPtr set;
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set = tmp->nodesetval;
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((set->nodeNr != 1) ||
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(set->nodeTab[0] != (xmlNodePtr) ctx->doc))
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			stack++;
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    stack++;
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeObject(tmp);
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (tmp != NULL);
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (stack != 0) {
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPtrErr(ctxt, XML_XPTR_EXTRA_OBJECTS,
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   "xmlXPtrEval: object(s) left on the eval stack\n",
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   NULL);
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->error != XPATH_EXPRESSION_OK) {
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(res);
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(ctxt);
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrBuildRangeNodeList:
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range:  a range object
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a node list tree copy of the range
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an xmlNodePtr list or NULL.
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the node tree.
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) {
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* pointers to generated nodes */
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr list = NULL, last = NULL, parent = NULL, tmp;
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* pointers to traversal nodes */
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr start, cur, end;
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int index1, index2;
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range == NULL)
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range->type != XPATH_RANGE)
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = (xmlNodePtr) range->user;
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end = range->user2;
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlCopyNode(start, 1));
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = start;
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    index1 = range->index;
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    index2 = range->index2;
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == end) {
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->type == XML_TEXT_NODE) {
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *content = cur->content;
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int len;
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (content == NULL) {
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlNewTextLen(NULL, 0);
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    len = index2;
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((cur == start) && (index1 > 1)) {
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			content += (index1 - 1);
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			len -= (index1 - 1);
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			index1 = 0;
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			len = index2;
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlNewTextLen(content, len);
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* single sub text node selection */
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (list == NULL)
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(tmp);
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* prune and return full set */
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last != NULL)
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAddNextSibling(last, tmp);
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAddChild(parent, tmp);
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(list);
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlCopyNode(cur, 0);
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (list == NULL)
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    list = tmp;
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else {
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (last != NULL)
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAddNextSibling(last, tmp);
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAddChild(parent, tmp);
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = NULL;
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		parent = tmp;
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (index2 > 1) {
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    end = xmlXPtrGetNthChild(cur, index2 - 1);
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    index2 = 0;
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((cur == start) && (index1 > 1)) {
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = xmlXPtrGetNthChild(cur, index1 - 1);
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    index1 = 0;
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->children;
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Now gather the remaining nodes from cur to end
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue; /* while */
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cur == start) &&
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (list == NULL) /* looks superfluous but ... */ ) {
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->type == XML_TEXT_NODE) ||
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->type == XML_CDATA_SECTION_NODE)) {
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *content = cur->content;
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (content == NULL) {
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlNewTextLen(NULL, 0);
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (index1 > 1) {
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			content += (index1 - 1);
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlNewText(content);
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = list = tmp;
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((cur == start) && (index1 > 1)) {
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlCopyNode(cur, 0);
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    list = tmp;
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parent = tmp;
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last = NULL;
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = xmlXPtrGetNthChild(cur, index1 - 1);
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    index1 = 0;
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * Now gather the remaining nodes from cur to end
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue; /* while */
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlCopyNode(cur, 1);
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		list = tmp;
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		parent = NULL;
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = tmp;
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = NULL;
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (cur->type) {
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DTD_NODE:
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ELEMENT_DECL:
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ATTRIBUTE_DECL:
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ENTITY_NODE:
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Do not copy DTD informations */
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ENTITY_DECL:
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO /* handle crossing entities -> stack needed */
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_XINCLUDE_START:
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_XINCLUDE_END:
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* don't consider it part of the tree content */
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ATTRIBUTE_NODE:
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Humm, should not happen ! */
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    STRANGE
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlCopyNode(cur, 1);
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != NULL) {
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((list == NULL) || ((last == NULL) && (parent == NULL)))  {
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    STRANGE
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last != NULL)
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAddNextSibling(last, tmp);
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else {
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAddChild(parent, tmp);
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last = tmp;
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Skip to next node in document order
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((list == NULL) || ((last == NULL) && (parent == NULL)))  {
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPtrAdvanceNode(cur, NULL);
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(list);
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrBuildNodeList:
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the XPointer result from the evaluation.
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a node list tree copy of the XPointer result.
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will drop Attributes and Namespace declarations.
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an xmlNodePtr list or NULL.
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the node tree.
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrBuildNodeList(xmlXPathObjectPtr obj) {
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr list = NULL, last = NULL;
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL)
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (obj->type) {
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET: {
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodeSetPtr set = obj->nodesetval;
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set == NULL)
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < set->nodeNr;i++) {
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (set->nodeTab[i] == NULL)
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (set->nodeTab[i]->type) {
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_TEXT_NODE:
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_CDATA_SECTION_NODE:
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ELEMENT_NODE:
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ENTITY_REF_NODE:
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ENTITY_NODE:
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_PI_NODE:
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_COMMENT_NODE:
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_DOCUMENT_NODE:
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_HTML_DOCUMENT_NODE:
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_DOCB_DOCUMENT_NODE:
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_XINCLUDE_START:
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_XINCLUDE_END:
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ATTRIBUTE_NODE:
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_NAMESPACE_DECL:
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_DOCUMENT_TYPE_NODE:
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_DOCUMENT_FRAG_NODE:
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_NOTATION_NODE:
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_DTD_NODE:
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ELEMENT_DECL:
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ATTRIBUTE_DECL:
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ENTITY_DECL:
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue; /* for */
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL)
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    list = last = xmlCopyNode(set->nodeTab[i], 1);
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else {
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAddNextSibling(last, xmlCopyNode(set->nodeTab[i], 1));
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (last->next != NULL)
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			last = last->next;
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET: {
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user;
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set == NULL)
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < set->locNr;i++) {
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL)
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    list = last = xmlXPtrBuildNodeList(set->locTab[i]);
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAddNextSibling(last,
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPtrBuildNodeList(set->locTab[i]));
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last != NULL) {
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (last->next != NULL)
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			last = last->next;
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPtrBuildRangeNodeList(obj));
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlCopyNode(obj->user, 0));
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(list);
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			XPointer functions				*
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrNbLocChildren:
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  an xmlNodePtr
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Count the number of location children of @node or the length of the
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string value in case of text/PI/Comments nodes
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of location children
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrNbLocChildren(xmlNodePtr node) {
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node->type) {
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_HTML_DOCUMENT_NODE:
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_DOCUMENT_NODE:
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ELEMENT_NODE:
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->children;
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (node != NULL) {
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (node->type == XML_ELEMENT_NODE)
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret++;
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = node->next;
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ATTRIBUTE_NODE:
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_PI_NODE:
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_COMMENT_NODE:
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_TEXT_NODE:
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_CDATA_SECTION_NODE:
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ENTITY_REF_NODE:
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrlen(node->content);
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrHereFunction:
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing here() operation
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as described in 5.4.3
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1745df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs) {
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->here == NULL)
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPTR_SYNTAX_ERROR);
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->here, NULL));
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrOriginFunction:
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing origin() operation
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as described in 5.4.3
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1763df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs) {
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->origin == NULL)
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPTR_SYNTAX_ERROR);
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->origin, NULL));
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrStartPointFunction:
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing start-point() operation
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as described in 5.4.3
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ----------------
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location-set start-point(location-set)
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For each location x in the argument location-set, start-point adds a
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location of type point to the result location-set. That point represents
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the start point of location x and is determined by the following rules:
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type point, the start point is x.
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type range, the start point is the start point of x.
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type root, element, text, comment, or processing instruction,
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - the container node of the start point is x and the index is 0.
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type attribute or namespace, the function must signal a
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   syntax error.
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ----------------
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1796df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs) {
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr tmp, obj, point;
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset = NULL;
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr oldset = NULL;
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_LOCATIONSET) &&
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_NODESET)))
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE)
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->type == XPATH_NODESET) {
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * First convert to a location set
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval);
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(obj);
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj = tmp;
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newset = xmlXPtrLocationSetCreate(NULL);
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (newset == NULL) {
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(obj);
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_MEMORY_ERROR);
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = (xmlLocationSetPtr) obj->user;
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (oldset != NULL) {
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < oldset->locNr; i++) {
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = oldset->locTab[i];
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL)
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    point = NULL;
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (tmp->type) {
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    point = xmlXPtrNewPoint(tmp->user, tmp->index);
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE: {
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr node = tmp->user;
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node != NULL) {
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (node->type == XML_ATTRIBUTE_NODE) {
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* TODO: Namespace Nodes ??? */
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPtrFreeLocationSet(newset);
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_ERROR(XPTR_SYNTAX_ERROR);
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			point = xmlXPtrNewPoint(node, tmp->index);
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        }
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*** Should we raise an error ?
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(obj);
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(newset);
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_ERROR(XPATH_INVALID_TYPE)
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ***/
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (point != NULL)
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPtrLocationSetAdd(newset, point);
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(obj);
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEndPointFunction:
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing end-point() operation
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as described in 5.4.3
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ----------------------------
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location-set end-point(location-set)
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For each location x in the argument location-set, end-point adds a
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location of type point to the result location-set. That point represents
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the end point of location x and is determined by the following rules:
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type point, the resulting point is x.
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type range, the resulting point is the end point of x.
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type root or element, the container node of the resulting
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   point is x and the index is the number of location children of x.
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type text, comment, or processing instruction, the container
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   node of the resulting point is x and the index is the length of the
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   string-value of x.
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If x is of type attribute or namespace, the function must signal a
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   syntax error.
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ----------------------------
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1890df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs) {
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr tmp, obj, point;
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset = NULL;
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr oldset = NULL;
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_LOCATIONSET) &&
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_NODESET)))
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE)
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->type == XPATH_NODESET) {
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * First convert to a location set
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval);
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(obj);
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj = tmp;
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newset = xmlXPtrLocationSetCreate(NULL);
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = (xmlLocationSetPtr) obj->user;
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (oldset != NULL) {
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < oldset->locNr; i++) {
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = oldset->locTab[i];
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL)
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    point = NULL;
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (tmp->type) {
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    point = xmlXPtrNewPoint(tmp->user, tmp->index);
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE: {
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr node = tmp->user2;
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node != NULL) {
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (node->type == XML_ATTRIBUTE_NODE) {
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* TODO: Namespace Nodes ??? */
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPtrFreeLocationSet(newset);
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_ERROR(XPTR_SYNTAX_ERROR);
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			point = xmlXPtrNewPoint(node, tmp->index2);
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (tmp->user == NULL) {
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			point = xmlXPtrNewPoint(node,
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlXPtrNbLocChildren(node));
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        }
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*** Should we raise an error ?
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(obj);
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(newset);
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_ERROR(XPATH_INVALID_TYPE)
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ***/
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (point != NULL)
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPtrLocationSetAdd(newset, point);
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(obj);
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrCoveringRange:
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @loc:  the location for which the covering range must be computed
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A covering range is a range that wholly encompasses a location
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Section 5.3.3. Covering Ranges for All Location Types
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        http://www.w3.org/TR/xptr#N2267
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new location or NULL in case of error
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrCoveringRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) {
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (loc == NULL)
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL) ||
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->context->doc == NULL))
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (loc->type) {
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_POINT:
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPtrNewRange(loc->user, loc->index,
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			           loc->user, loc->index));
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_RANGE:
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (loc->user2 != NULL) {
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPtrNewRange(loc->user, loc->index,
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              loc->user2, loc->index2));
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr node = (xmlNodePtr) loc->user;
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (node == (xmlNodePtr) ctxt->context->doc) {
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(xmlXPtrNewRange(node, 0, node,
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					   xmlXPtrGetArity(node)));
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    switch (node->type) {
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_ATTRIBUTE_NODE:
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* !!! our model is slightly different than XPath */
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(xmlXPtrNewRange(node, 0, node,
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					           xmlXPtrGetArity(node)));
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_ELEMENT_NODE:
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_TEXT_NODE:
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_CDATA_SECTION_NODE:
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_ENTITY_REF_NODE:
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_PI_NODE:
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_COMMENT_NODE:
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_DOCUMENT_NODE:
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_NOTATION_NODE:
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_HTML_DOCUMENT_NODE: {
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int indx = xmlXPtrGetIndex(node);
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    node = node->parent;
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(xmlXPtrNewRange(node, indx - 1,
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					           node, indx + 1));
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			default:
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(NULL);
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO /* missed one case ??? */
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
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 * xmlXPtrRangeFunction:
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing the range() function 5.4.3
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  location-set range(location-set )
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  The range function returns ranges covering the locations in
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  the argument location-set. For each location x in the argument
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  location-set, a range location representing the covering range of
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  x is added to the result location-set.
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2035df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) {
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr set;
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr oldset;
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset;
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_LOCATIONSET) &&
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_NODESET)))
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE)
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set = valuePop(ctxt);
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set->type == XPATH_NODESET) {
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp;
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * First convert to a location set
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval);
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(set);
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set = tmp;
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = (xmlLocationSetPtr) set->user;
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * The loop is to compute the covering range for each item and add it
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newset = xmlXPtrLocationSetCreate(NULL);
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < oldset->locNr;i++) {
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrLocationSetAdd(newset,
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPtrCoveringRange(ctxt, oldset->locTab[i]));
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Save the new value and cleanup
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(set);
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrInsideRange:
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @loc:  the location for which the inside range must be computed
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A inside range is a range described in the range-inside() description
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new location or NULL in case of error
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrInsideRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) {
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (loc == NULL)
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL) ||
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->context->doc == NULL))
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (loc->type) {
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_POINT: {
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr node = (xmlNodePtr) loc->user;
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (node->type) {
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_PI_NODE:
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_COMMENT_NODE:
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_TEXT_NODE:
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_CDATA_SECTION_NODE: {
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node->content == NULL) {
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(xmlXPtrNewRange(node, 0, node, 0));
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(xmlXPtrNewRange(node, 0, node,
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					       xmlStrlen(node->content)));
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ATTRIBUTE_NODE:
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ELEMENT_NODE:
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ENTITY_REF_NODE:
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DOCUMENT_NODE:
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_NOTATION_NODE:
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_HTML_DOCUMENT_NODE: {
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(xmlXPtrNewRange(node, 0, node,
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					   xmlXPtrGetArity(node)));
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_RANGE: {
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr node = (xmlNodePtr) loc->user;
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (loc->user2 != NULL) {
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPtrNewRange(node, loc->index,
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			               loc->user2, loc->index2));
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (node->type) {
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_PI_NODE:
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_COMMENT_NODE:
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_TEXT_NODE:
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_CDATA_SECTION_NODE: {
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (node->content == NULL) {
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(xmlXPtrNewRange(node, 0, node, 0));
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(xmlXPtrNewRange(node, 0, node,
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   xmlStrlen(node->content)));
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ATTRIBUTE_NODE:
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ELEMENT_NODE:
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_ENTITY_REF_NODE:
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_DOCUMENT_NODE:
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_NOTATION_NODE:
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_HTML_DOCUMENT_NODE: {
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(xmlXPtrNewRange(node, 0, node,
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					       xmlXPtrGetArity(node)));
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    default:
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO /* missed one case ??? */
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrRangeInsideFunction:
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing the range-inside() function 5.4.3
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  location-set range-inside(location-set )
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  The range-inside function returns ranges covering the contents of
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  the locations in the argument location-set. For each location x in
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  the argument location-set, a range location is added to the result
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  location-set. If x is a range location, then x is added to the
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  result location-set. If x is not a range location, then x is used
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  as the container location of the start and end points of the range
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  location to be added; the index of the start point of the range is
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  zero; if the end point is a character point then its index is the
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  length of the string-value of x, and otherwise is the number of
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  location children of x.
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2181df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) {
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr set;
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr oldset;
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset;
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_LOCATIONSET) &&
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_NODESET)))
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE)
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set = valuePop(ctxt);
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set->type == XPATH_NODESET) {
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp;
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * First convert to a location set
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval);
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(set);
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set = tmp;
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = (xmlLocationSetPtr) set->user;
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * The loop is to compute the covering range for each item and add it
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newset = xmlXPtrLocationSetCreate(NULL);
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < oldset->locNr;i++) {
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrLocationSetAdd(newset,
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPtrInsideRange(ctxt, oldset->locTab[i]));
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Save the new value and cleanup
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(set);
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrRangeToFunction:
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the range-to() XPointer function
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) {
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr range;
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res, obj;
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr tmp;
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset = NULL;
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr oldset;
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Save the expression pointer since we will have to evaluate
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * it multiple times. Initialize the new set.
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NODESET);
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = obj->nodesetval;
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = NULL;
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->cur;
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newset = xmlXPtrLocationSetCreate(NULL);
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < oldset->nodeNr; i++) {
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->cur = cur;
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Run the evaluation with a node list made of a single item
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * in the nodeset.
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = oldset->nodeTab[i];
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlXPathNewNodeSet(ctxt->context->node);
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, tmp);
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathEvalExpr(ctxt);
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * The result of the evaluation need to be tested to
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * decided whether the filter succeeded or not
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(ctxt);
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res);
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (range != NULL) {
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrLocationSetAdd(newset, range);
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Cleanup
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != NULL)
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeObject(res);
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value == tmp) {
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeObject(res);
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * The result is used as the new evaluation set.
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(obj);
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = NULL;
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->contextSize = -1;
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->proximityPosition = -1;
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrAdvanceNode:
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the node
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @level: incremented/decremented to show level in tree
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Advance to the next element or text node in document order
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: add a stack for entering/exiting entities
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrAdvanceNode(xmlNodePtr cur, int *level) {
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext:
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->children != NULL) {
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->children ;
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (level != NULL)
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (*level)++;
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto found;
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectskip:		/* This label should only be needed if something is wrong! */
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) {
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto found;
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (level != NULL)
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (*level)--;
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL) return(NULL);
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto found;
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (cur != NULL);
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound:
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type != XML_ELEMENT_NODE) &&
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->type != XML_TEXT_NODE) &&
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->type != XML_DOCUMENT_NODE) &&
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->type != XML_HTML_DOCUMENT_NODE) &&
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->type != XML_CDATA_SECTION_NODE)) {
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->type == XML_ENTITY_REF_NODE) {	/* Shouldn't happen */
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto skip;
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next;
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrAdvanceChar:
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @indx:  the indx
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @bytes:  the number of bytes
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Advance a point of the associated number of bytes (not UTF8 chars)
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int bytes) {
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pos;
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (indx == NULL))
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = *node;
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pos = *indx;
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (bytes >= 0) {
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * First position to the beginning of the first text node
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * corresponding to this point
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((cur != NULL) &&
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((cur->type == XML_ELEMENT_NODE) ||
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (cur->type == XML_DOCUMENT_NODE) ||
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (cur->type == XML_HTML_DOCUMENT_NODE))) {
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pos > 0) {
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlXPtrGetNthChild(cur, pos);
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pos = 0;
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlXPtrAdvanceNode(cur, NULL);
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pos = 0;
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL) {
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = NULL;
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *indx = 0;
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * if there is no move needed return the current value.
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pos == 0) pos = 1;
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bytes == 0) {
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = cur;
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *indx = pos;
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * We should have a text (or cdata) node ...
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = 0;
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type != XML_ELEMENT_NODE) &&
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->content != NULL)) {
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlStrlen(cur->content);
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pos > len) {
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Strange, the indx in the text node is greater than it's len */
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pos = len;
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pos + bytes >= len) {
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bytes -= (len - pos);
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = xmlXPtrAdvanceNode(cur, NULL);
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pos = 0;
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (pos + bytes < len) {
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pos += bytes;
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = cur;
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *indx = pos;
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrMatchString:
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string:  the string to search
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the start textnode
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @startindex:  the start index
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the end textnode IN/OUT
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @endindex:  the end index IN/OUT
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the document contains @string at the position
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (@start, @startindex) and limited by the (@end, @endindex) point
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 if not found, 1 if found in which case
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            (@start, @startindex) will indicate the position of the beginning
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            of the range and (@end, @endindex) will indicate the end
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            of the range
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrMatchString(const xmlChar *string, xmlNodePtr start, int startindex,
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            xmlNodePtr *end, int *endindex) {
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pos; /* 0 based */
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len; /* in bytes */
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stringlen; /* in bytes */
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int match;
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string == NULL)
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL)
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((end == NULL) || (endindex == NULL))
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = start;
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pos = startindex - 1;
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    stringlen = xmlStrlen(string);
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (stringlen > 0) {
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur == *end) && (pos + stringlen > *endindex))
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) {
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlStrlen(cur->content);
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (len >= pos + stringlen) {
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		match = (!xmlStrncmp(&cur->content[pos], string, stringlen));
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (match) {
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "found range %d bytes at index %d of ->",
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    stringlen, pos + 1);
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlDebugDumpString(stdout, cur->content);
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext, "\n");
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *end = cur;
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *endindex = pos + stringlen;
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int sub = len - pos;
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		match = (!xmlStrncmp(&cur->content[pos], string, sub));
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (match) {
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "found subrange %d bytes at index %d of ->",
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    sub, pos + 1);
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlDebugDumpString(stdout, cur->content);
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext, "\n");
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    string = &string[sub];
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    stringlen -= sub;
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPtrAdvanceNode(cur, NULL);
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL)
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pos = 0;
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrSearchString:
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string:  the string to search
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the start textnode IN/OUT
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @startindex:  the start index IN/OUT
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the end textnode
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @endindex:  the end index
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the next occurrence of @string within the document content
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * until the (@end, @endindex) point is reached
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 if not found, 1 if found in which case
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            (@start, @startindex) will indicate the position of the beginning
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            of the range and (@end, @endindex) will indicate the end
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            of the range
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrSearchString(const xmlChar *string, xmlNodePtr *start, int *startindex,
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            xmlNodePtr *end, int *endindex) {
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *str;
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pos; /* 0 based */
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len; /* in bytes */
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar first;
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string == NULL)
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((start == NULL) || (startindex == NULL))
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((end == NULL) || (endindex == NULL))
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = *start;
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pos = *startindex - 1;
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    first = string[0];
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) {
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlStrlen(cur->content);
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (pos <= len) {
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (first != 0) {
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    str = xmlStrchr(&cur->content[pos], first);
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (str != NULL) {
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pos = (str - (xmlChar *)(cur->content));
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlGenericError(xmlGenericErrorContext,
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"found '%c' at index %d of ->",
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				first, pos + 1);
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlDebugDumpString(stdout, cur->content);
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlGenericError(xmlGenericErrorContext, "\n");
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPtrMatchString(string, cur, pos + 1,
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					       end, endindex)) {
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *start = cur;
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *startindex = pos + 1;
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(1);
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pos++;
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pos = len + 1;
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * An empty string is considered to match before each
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * character of the string-value and after the final
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * character.
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "found '' at index %d of ->",
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    pos + 1);
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlDebugDumpString(stdout, cur->content);
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext, "\n");
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *start = cur;
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *startindex = pos + 1;
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *end = cur;
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *endindex = pos + 1;
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur == *end) && (pos >= *endindex))
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPtrAdvanceNode(cur, NULL);
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL)
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pos = 1;
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetLastChar:
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @index:  the index
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Computes the point coordinates of the last char of this point
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetLastChar(xmlNodePtr *node, int *indx) {
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pos, len = 0;
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (indx == NULL))
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = *node;
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pos = *indx;
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2635df143a5041f03a22808b59c76698770b74692815Selim Gurun
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type == XML_ELEMENT_NODE) ||
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->type == XML_DOCUMENT_NODE) ||
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->type == XML_HTML_DOCUMENT_NODE)) {
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pos > 0) {
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = xmlXPtrGetNthChild(cur, pos);
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->last != NULL)
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->last;
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if ((cur->type != XML_ELEMENT_NODE) &&
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (cur->content != NULL)) {
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlStrlen(cur->content);
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *node = cur;
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *indx = len;
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetStartPoint:
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  an range
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the resulting node
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @indx:  the resulting index
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * read the object and return the start point coordinates.
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetStartPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) {
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj == NULL) || (node == NULL) || (indx == NULL))
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (obj->type) {
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_POINT:
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = obj->user;
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->index <= 0)
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = 0;
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = obj->index;
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_RANGE:
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = obj->user;
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->index <= 0)
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = 0;
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = obj->index;
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrGetEndPoint:
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  an range
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the resulting node
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @indx:  the resulting indx
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * read the object and return the end point coordinates.
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrGetEndPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) {
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj == NULL) || (node == NULL) || (indx == NULL))
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (obj->type) {
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_POINT:
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = obj->user;
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->index <= 0)
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = 0;
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = obj->index;
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_RANGE:
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *node = obj->user;
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->index <= 0)
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = 0;
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*indx = obj->index;
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrStringRangeFunction:
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of args
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function implementing the string-range() function
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * range as described in 5.4.2
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ------------------------------
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [Definition: For each location in the location-set argument,
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-range returns a set of string ranges, a set of substrings in a
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. Specifically, the string-value of the location is searched for
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substrings that match the string argument, and the resulting location-set
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will contain a range location for each non-overlapping match.]
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * An empty string is considered to match before each character of the
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value and after the final character. Whitespace in a string
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is matched literally, with no normalization except that provided by
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML for line ends. The third argument gives the position of the first
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character to be in the resulting range, relative to the start of the
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * match. The default value is 1, which makes the range start immediately
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before the first character of the matched string. The fourth argument
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * gives the number of characters in the range; the default is that the
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * range extends to the end of the matched string.
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Element boundaries, as well as entire embedded nodes such as processing
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * instructions and comments, are ignored as defined in [XPath].
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the string in the second argument is not found in the string-value
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the location, or if a value in the third or fourth argument indicates
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a string that is beyond the beginning or end of the document, the
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression fails.
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The points of the range-locations in the returned location-set will
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * all be character points.
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ------------------------------
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2769df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) {
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, startindex, endindex = 0, fendindex;
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr start, end = 0, fend;
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr set;
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr oldset;
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset;
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr string;
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr position = NULL;
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr number = NULL;
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int found, pos = 0, num = 0;
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Grab the arguments
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((nargs < 2) || (nargs > 4))
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_ARITY);
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs >= 4) {
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_TYPE(XPATH_NUMBER);
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	number = valuePop(ctxt);
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (number != NULL)
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    num = (int) number->floatval;
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs >= 3) {
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_TYPE(XPATH_NUMBER);
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	position = valuePop(ctxt);
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (position != NULL)
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pos = (int) position->floatval;
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    string = valuePop(ctxt);
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_LOCATIONSET) &&
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_NODESET)))
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE)
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set = valuePop(ctxt);
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newset = xmlXPtrLocationSetCreate(NULL);
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set->nodesetval == NULL) {
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set->type == XPATH_NODESET) {
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp;
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * First convert to a location set
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval);
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(set);
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set = tmp;
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = (xmlLocationSetPtr) set->user;
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * The loop is to search for each element in the location set
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the list of location set corresponding to that search
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < oldset->locNr;i++) {
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpObject(stdout, oldset->locTab[i], 0);
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrGetStartPoint(oldset->locTab[i], &start, &startindex);
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrGetEndPoint(oldset->locTab[i], &end, &endindex);
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrAdvanceChar(&start, &startindex, 0);
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPtrGetLastChar(&end, &endindex);
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_RANGES
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"from index %d of ->", startindex);
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpString(stdout, start->content);
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "\n");
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"to index %d of ->", endindex);
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpString(stdout, end->content);
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "\n");
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fend = end;
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fendindex = endindex;
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = xmlXPtrSearchString(string->stringval, &start, &startindex,
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                        &fend, &fendindex);
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found == 1) {
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (position == NULL) {
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPtrLocationSetAdd(newset,
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlXPtrNewRange(start, startindex, fend, fendindex));
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlXPtrAdvanceChar(&start, &startindex,
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                      pos - 1) == 0) {
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((number != NULL) && (num > 0)) {
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int rindx;
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr rend;
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			rend = start;
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			rindx = startindex - 1;
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPtrAdvanceChar(&rend, &rindx,
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				               num) == 0) {
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPtrLocationSetAdd(newset,
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					xmlXPtrNewRange(start, startindex,
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project							rend, rindx));
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((number != NULL) && (num <= 0)) {
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPtrLocationSetAdd(newset,
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlXPtrNewRange(start, startindex,
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    start, startindex));
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPtrLocationSetAdd(newset,
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlXPtrNewRange(start, startindex,
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    fend, fendindex));
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		start = fend;
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		startindex = fendindex;
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (string->stringval[0] == 0)
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    startindex++;
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (found == 1);
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Save the new value and cleanup
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(set);
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(string);
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (position) xmlXPathFreeObject(position);
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (number) xmlXPathFreeObject(number);
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPtrEvalRangePredicate:
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPointer Parser context
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [8]   Predicate ::=   '[' PredicateExpr ']'
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [9]   PredicateExpr ::=   Expr
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate as in xmlXPathEvalPredicate() but for
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a Location Set instead of a node set
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctxt) {
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res;
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj, tmp;
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr newset = NULL;
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlLocationSetPtr oldset;
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '[') {
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Extract the old set, and then evaluate the result of the
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * expression for all the element in the set. use it to grow
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * up a new set.
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_LOCATIONSET);
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = obj->user;
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = NULL;
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((oldset == NULL) || (oldset->locNr == 0)) {
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = 0;
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = 0;
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathEvalExpr(ctxt);
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(ctxt);
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != NULL)
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeObject(res);
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, obj);
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Save the expression pointer since we will have to evaluate
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * it multiple times. Initialize the new set.
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = ctxt->cur;
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newset = xmlXPtrLocationSetCreate(NULL);
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < oldset->locNr; i++) {
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cur = cur;
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Run the evaluation with a node list made of a single item
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * in the nodeset.
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = oldset->locTab[i]->user;
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlXPathNewNodeSet(ctxt->context->node);
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, tmp);
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = oldset->locNr;
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = i + 1;
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathEvalExpr(ctxt);
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR;
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * The result of the evaluation need to be tested to
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * decided whether the filter succeeded or not
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPtrLocationSetAdd(newset,
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathObjectCopy(oldset->locTab[i]));
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Cleanup
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL)
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(res);
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == tmp) {
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = valuePop(ctxt);
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(res);
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = NULL;
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * The result is used as the new evaluation set.
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(obj);
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = -1;
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = -1;
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != ']') {
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xpointer
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3013