1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xpath.c: XML Path Language implementation
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *          XPath is a language for addressing parts of an XML document,
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *          designed to be used by both XSLT and XPointer
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *f
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reference: W3C Recommendation 16 November 1999
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     http://www.w3.org/TR/1999/REC-xpath-19991116
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Public reference:
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     http://www.w3.org/TR/xpath
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Author: daniel@veillard.com
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
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#include <string.h>
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TYPES_H
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/types.h>
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_MATH_H
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <math.h>
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FLOAT_H
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <float.h>
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h>
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SIGNAL_H
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <signal.h>
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h>
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h>
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpath.h>
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpathInternals.h>
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h>
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpointer.h>
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/debugXML.h>
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h>
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/threads.h>
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h>
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/pattern.h>
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STREAMING
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define TODO								\
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_OPTIMIZED_NON_ELEM_COMPARISON:
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* If defined, this will use xmlXPathCmpNodesExt() instead of
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlXPathCmpNodes(). The new function is optimized comparison of
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* non-element nodes; actually it will speed up comparison only if
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlXPathOrderDocElems() was called in order to index the elements of
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* a tree in document order; Libxslt does such an indexing, thus it will
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* benefit from this optimization.
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_OPTIMIZED_NON_ELEM_COMPARISON
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_OPTIMIZED_FILTER_FIRST:
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* If defined, this will optimize expressions like "key('foo', 'val')[b][1]"
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* in a way, that it stop evaluation at the first node.
8260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott*/
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_OPTIMIZED_FILTER_FIRST
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_DEBUG_OBJ_USAGE:
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Internal flag to enable tracking of how much XPath objects have been
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* created.
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEBUG_OBJ_USAGE */
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO:
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There are a few spots where some tests are done which depend upon ascii
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data.  These should be enhanced for full UTF8 support (see particularly
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT)
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
10260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
10360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *			Floating point stuff				*
10460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef TRIO_REPLACE_STDIO
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TRIO_PUBLIC static
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "trionan.c"
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lack of portability of this section of the libc is annoying !
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathNAN = 0;
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathPINF = 1;
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathNINF = -1;
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double xmlXPathNZERO = 0; /* not exported from headers */
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathInitialized = 0;
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathInit:
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the XPath environment
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathInit(void) {
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathInitialized) return;
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathPINF = trio_pinf();
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNINF = trio_ninf();
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNAN = trio_nan();
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNZERO = trio_nzero();
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInitialized = 1;
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNaN:
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a double value
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable isnan() function to detect whether a double
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is a NotaNumber. Based on trio code
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/
14560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the value is a NaN, 0 otherwise
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNaN(double val) {
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(trio_isnan(val));
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsInf:
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a double value
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable isinf() function to detect whether a double
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is a +Infinite or -Infinite. Based on trio code
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/
16060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsInf(double val) {
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(trio_isinf(val));
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* SCHEMAS or XPATH */
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPATH_ENABLED
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetSign:
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a double value
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable function to detect the sign of a double
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified from trio code
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/
17760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the value is Negative, 0 if positive
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetSign(double val) {
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(trio_signbit(val));
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: when compatibility allows remove all "fake node libxslt" strings
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       the test should just be name[0] = ' '
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef DEBUG_XPATH_EXPRESSION
19160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define DEBUG_STEP
19260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define DEBUG_EXPR
19360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define DEBUG_EVAL_COUNTS
19460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNs xmlXPathXMLNamespaceStruct = {
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NULL,
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_NAMESPACE_DECL,
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_XML_NAMESPACE,
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    BAD_CAST "xml",
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NULL,
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NULL
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct;
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
20660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/*
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimizer is disabled only when threaded apps are detected while
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the library ain't compiled for thread safety.
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDisableOptimizer = 0;
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Error handling routines				*
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XP_ERRORNULL:
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @X:  the error code
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macro to raise an XPath error and return NULL.
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_ERRORNULL(X)							\
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    { xmlXPathErr(ctxt, X); return(NULL); }
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The array xmlXPathErrorMessages corresponds to the enum xmlXPathError
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *xmlXPathErrorMessages[] = {
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Ok\n",
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Number encoding\n",
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Unfinished literal\n",
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Start of literal\n",
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Expected $ for variable reference\n",
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Undefined variable\n",
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid predicate\n",
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid expression\n",
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Missing closing curly brace\n",
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Unregistered function\n",
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid operand\n",
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid type\n",
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid number of arguments\n",
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid context size\n",
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid context position\n",
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Memory allocation error\n",
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Syntax error\n",
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Resource error\n",
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Sub resource error\n",
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Undefined namespace prefix\n",
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Encoding error\n",
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Char out of XML range\n",
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid or incomplete context\n",
255df143a5041f03a22808b59c76698770b74692815Selim Gurun    "Stack usage errror\n",
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "?? Unknown error ??\n"	/* Must be last in the list! */
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) /	\
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   sizeof(xmlXPathErrorMessages[0])) - 1)
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErrMemory:
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath context
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra)
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (extra) {
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar buf[200];
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlStrPrintf(buf, 200,
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         BAD_CAST "Memory allocation failed : %s\n",
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         extra);
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->lastError.message = (char *) xmlStrdup(buf);
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->lastError.message = (char *)
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       xmlStrdup(BAD_CAST "Memory allocation failed\n");
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->lastError.domain = XML_FROM_XPATH;
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->lastError.code = XML_ERR_NO_MEMORY;
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->error != NULL)
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->error(ctxt->userData, &ctxt->lastError);
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (extra)
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __xmlRaiseError(NULL, NULL, NULL,
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL, NULL, XML_FROM_XPATH,
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0,
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            extra, NULL, NULL, 0, 0,
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "Memory allocation failed : %s\n", extra);
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __xmlRaiseError(NULL, NULL, NULL,
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL, NULL, XML_FROM_XPATH,
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0,
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL, NULL, NULL, 0, 0,
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "Memory allocation failed\n");
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPErrMemory:
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra)
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(NULL, extra);
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->error = XPATH_MEMORY_ERROR;
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(ctxt->context, extra);
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErr:
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a XPath parser context
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error:  the error code
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an XPath error
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErr(xmlXPathParserContextPtr ctxt, int error)
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((error < 0) || (error > MAXERRNO))
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	error = MAXERRNO;
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, XML_FROM_XPATH,
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK,
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, NULL, 0, 0,
33843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich			"%s", xmlXPathErrorMessages[error]);
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = error;
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context == NULL) {
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, XML_FROM_XPATH,
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK,
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const char *) ctxt->base, NULL, NULL,
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->cur - ctxt->base, 0,
34943ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich			"%s", xmlXPathErrorMessages[error]);
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* cleanup current last error */
35460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlResetError(&ctxt->context->lastError);
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.domain = XML_FROM_XPATH;
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK -
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           XPATH_EXPRESSION_OK;
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.level = XML_ERR_ERROR;
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base);
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.int1 = ctxt->cur - ctxt->base;
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.node = ctxt->context->debugNode;
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->error != NULL) {
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->error(ctxt->context->userData,
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     &ctxt->context->lastError);
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, ctxt->context->debugNode, XML_FROM_XPATH,
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK,
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const char *) ctxt->base, NULL, NULL,
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->cur - ctxt->base, 0,
37343ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich			"%s", xmlXPathErrorMessages[error]);
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPatherror:
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @file:  the file name
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @line:  the line number
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @no:  the error number
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formats an error message.
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED,
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              int line ATTRIBUTE_UNUSED, int no) {
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathErr(ctxt, no);
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
39460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
39560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *			Utilities					*
39660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerList:
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pointer-list for various purposes.
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlPointerList xmlPointerList;
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlPointerList *xmlPointerListPtr;
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlPointerList {
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void **items;
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int number;
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Since such a list-handling is used in xmlschemas.c and libxslt
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* and here, we should make the functions public.
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
41660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlPointerListAddSize(xmlPointerListPtr list,
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       void *item,
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int initialSize)
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (initialSize <= 0)
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize = 1;
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize * sizeof(void *));
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL,
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlPointerListCreate: allocating item\n");
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->number = 0;
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->size = initialSize;
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->size <= list->number) {
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->size *= 2;
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->size * sizeof(void *));
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL,
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlPointerListCreate: re-allocating item\n");
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->size = 0;
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->items[list->number++] = item;
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListCreate:
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an xsltPointerList structure.
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a xsltPointerList structure or NULL in case of an error.
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlPointerListPtr
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListCreate(int initialSize)
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr ret;
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlMalloc(sizeof(xmlPointerList));
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(NULL,
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "xmlPointerListCreate: allocating item\n");
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlPointerList));
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (initialSize > 0) {
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlPointerListAddSize(ret, NULL, initialSize);
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->number = 0;
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListFree:
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees the xsltPointerList structure. This does not free
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content of the list.
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListFree(xmlPointerListPtr list)
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL)
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items != NULL)
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
49060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
49160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *			Parser Types					*
49260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Types are private:
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_END=0,
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_AND,
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_OR,
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_EQUAL,
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_CMP,
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_PLUS,
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_MULT,
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_UNION,
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_ROOT,
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_NODE,
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_RESET, /* 10 */
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_COLLECT,
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_VALUE, /* 12 */
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_VARIABLE,
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_FUNCTION,
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_ARG,
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_PREDICATE,
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_FILTER, /* 17 */
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_SORT /* 18 */
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ,XPATH_OP_RANGETO
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathOp;
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_ANCESTOR = 1,
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_ANCESTOR_OR_SELF,
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_ATTRIBUTE,
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_CHILD,
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_DESCENDANT,
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_DESCENDANT_OR_SELF,
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_FOLLOWING,
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_FOLLOWING_SIBLING,
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_NAMESPACE,
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_PARENT,
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_PRECEDING,
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_PRECEDING_SIBLING,
53760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    AXIS_SELF
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathAxisVal;
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_NONE = 0,
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_TYPE = 1,
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_PI = 2,
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_ALL = 3,
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_NS = 4,
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_NAME = 5
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTestVal;
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_NODE = 0,
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_COMMENT = XML_COMMENT_NODE,
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_TEXT = XML_TEXT_NODE,
55360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    NODE_TYPE_PI = XML_PI_NODE
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTypeVal;
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_REWRITE_DOS_CHILD_ELEM 1
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathStepOp xmlXPathStepOp;
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathStepOp *xmlXPathStepOpPtr;
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathStepOp {
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathOp op;		/* The identifier of the operation */
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ch1;			/* First child */
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ch2;			/* Second child */
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value;
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value2;
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value3;
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *value4;
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *value5;
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *cache;
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *cacheURI;
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int rewriteType;
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathCompExpr {
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbStep;			/* Number of steps in this expression */
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxStep;		/* Maximum number of steps allocated */
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOp *steps;	/* ops for computation of this expression */
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int last;			/* index of last step in expression */
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *expr;		/* the expression being computed */
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;		/* the dictionnary to use if any */
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb;
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *string;
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPatternPtr stream;
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
59160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
59260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *			Forward declarations				*
59360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj);
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj);
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathStepOpPtr op, xmlNodePtr *first);
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int isPredicate);
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
60860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
60960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *			Parser Type functions				*
61060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *									*
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCompExpr:
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new Xpath component
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCompExpr(void) {
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr cur;
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr));
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "allocating component\n");
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(cur, 0, sizeof(xmlXPathCompExpr));
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->maxStep = 10;
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nbStep = 0;
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep *
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                   sizeof(xmlXPathStepOp));
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->steps == NULL) {
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "allocating steps\n");
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(cur);
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp));
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->last = -1;
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nb = 0;
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeCompExpr:
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  an XPATH comp
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by @comp
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCompExpr(xmlXPathCompExprPtr comp)
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOpPtr op;
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp == NULL)
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->dict == NULL) {
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < comp->nbStep; i++) {
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = &comp->steps[i];
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value4 != NULL) {
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (op->op == XPATH_OP_VALUE)
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(op->value4);
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(op->value4);
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value5 != NULL)
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(op->value5);
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < comp->nbStep; i++) {
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = &comp->steps[i];
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value4 != NULL) {
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (op->op == XPATH_OP_VALUE)
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(op->value4);
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlDictFree(comp->dict);
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->steps != NULL) {
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(comp->steps);
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->string != NULL) {
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(comp->string);
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->stream != NULL) {
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreePatternList(comp->stream);
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->expr != NULL) {
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(comp->expr);
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(comp);
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompExprAdd:
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled expression
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch1: first child index
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch2: second child index
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an op
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the first int value
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second int value
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value3:  the third int value
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value4:  the first string value
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value5:  the second string value
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a step to an XPath Compiled Expression
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the index otherwise
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2,
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   xmlXPathOp op, int value,
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   int value2, int value3, void *value4, void *value5) {
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->nbStep >= comp->maxStep) {
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathStepOp *real;
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->maxStep *= 2;
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	real = (xmlXPathStepOp *) xmlRealloc(comp->steps,
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                      comp->maxStep * sizeof(xmlXPathStepOp));
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (real == NULL) {
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->maxStep /= 2;
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "adding step\n");
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->steps = real;
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->last = comp->nbStep;
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].rewriteType = 0;
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].ch1 = ch1;
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].ch2 = ch2;
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].op = op;
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].value = value;
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].value2 = value2;
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].value3 = value3;
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp->dict != NULL) &&
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) ||
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (op == XPATH_OP_COLLECT))) {
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (value4 != NULL) {
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value4 = (xmlChar *)
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (void *)xmlDictLookup(comp->dict, value4, -1);
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value4);
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value4 = NULL;
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (value5 != NULL) {
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value5 = (xmlChar *)
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (void *)xmlDictLookup(comp->dict, value5, -1);
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value5);
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value5 = NULL;
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->steps[comp->nbStep].value4 = value4;
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->steps[comp->nbStep].value5 = value5;
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].cache = NULL;
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(comp->nbStep++);
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompSwap:
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled expression
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: operation index
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Swaps 2 operations in the compiled expression
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompSwap(xmlXPathStepOpPtr op) {
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Since this manipulates possibly shared variables, this is
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * disabled if one detects that the library is used in a multithreaded
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * application
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathDisableOptimizer)
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = op->ch1;
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    op->ch1 = op->ch2;
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    op->ch2 = tmp;
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5)	\
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprAdd(ctxt->comp, (op1), (op2),			\
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                (op), (val), (val2), (val3), (val4), (val5))
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5)			\
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1,		\
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                (op), (val), (val2), (val3), (val4), (val5))
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
80060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define PUSH_LEAVE_EXPR(op, val, val2)					\
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL)
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
80360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define PUSH_UNARY_EXPR(op, ch, val, val2)				\
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL)
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
80660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2)			\
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op),			\
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(val), (val2), 0 ,NULL ,NULL)
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
81260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *		XPath object cache structures				*
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEFAULT_CACHE_ON */
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL))
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathContextCache xmlXPathContextCache;
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathContextCache *xmlXPathContextCachePtr;
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathContextCache {
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr nodesetObjs;  /* contains xmlXPathObjectPtr */
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr stringObjs;   /* contains xmlXPathObjectPtr */
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr booleanObjs;  /* contains xmlXPathObjectPtr */
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr numberObjs;   /* contains xmlXPathObjectPtr */
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr miscObjs;     /* contains xmlXPathObjectPtr */
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxNodeset;
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxString;
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxBoolean;
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxNumber;
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxMisc;
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedAll;
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedNodeset;
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedString;
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedBool;
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedNumber;
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedPoint;
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedRange;
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedLocset;
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedUsers;
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedXSLTTree;
84460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int dbgCachedUndefined;
84560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedAll;
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedNodeset;
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedString;
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedBool;
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedNumber;
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedPoint;
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedRange;
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedLocset;
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedUsers;
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedXSLTTree;
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedUndefined;
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
86460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *		Debugging related functions				*
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
86860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define STRANGE							\
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error at %s:%d\n",				\
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) {
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
88343ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Node is NULL !\n");
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
88660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type == XML_DOCUMENT_NODE) ||
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (cur->type == XML_HTML_DOCUMENT_NODE)) {
89143ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " /\n");
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->type == XML_ATTRIBUTE_NODE)
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth);
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpOneNode(output, cur, depth);
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) {
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp;
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
90843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Node is NULL !\n");
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
91160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = cur;
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpOneNode(output, tmp, depth);
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) {
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
93143ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NodeSet is NULL !\n");
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
93460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL) {
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Set contains %d nodes:\n", cur->nodeNr);
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < cur->nodeNr;i++) {
94043ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	    fprintf(output, "%s", shift);
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "%d", i + 1);
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1);
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) {
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) {
95743ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Value Tree is NULL !\n");
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
96060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
96343ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich    fprintf(output, "%s", shift);
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d", i + 1);
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1);
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED)
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) {
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
97843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "LocationSet is NULL !\n");
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
98160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->locNr;i++) {
98543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich	fprintf(output, "%s", shift);
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%d : ", i + 1);
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1);
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpObject:
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the FILE * to dump the output
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the object to inspect
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth:  indentation level
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the content of the object for debugging purposes
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) {
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL) return;
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
101243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich    fprintf(output, "%s", shift);
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "Object is empty (NULL)\n");
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch(cur->type) {
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_UNDEFINED:
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is uninitialized\n");
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a Node Set :\n");
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth);
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is an XSLT value tree :\n");
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth);
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a Boolean : ");
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->boolval) fprintf(output, "true\n");
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else fprintf(output, "false\n");
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (xmlXPathIsInf(cur->floatval)) {
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 1:
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a number : Infinity\n");
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case -1:
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a number : -Infinity\n");
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlXPathIsNaN(cur->floatval)) {
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "Object is a number : NaN\n");
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) {
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "Object is a number : 0\n");
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "Object is a number : %0g\n", cur->floatval);
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a string : ");
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDebugDumpString(output, cur->stringval);
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a point : index %d in node", cur->index);
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1);
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->user2 == NULL) ||
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->user2 == cur->user) && (cur->index == cur->index2))) {
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a collapsed range :\n");
106743ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich		fprintf(output, "%s", shift);
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->index >= 0)
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "index %d in ", cur->index);
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "node\n");
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user,
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              depth + 1);
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else  {
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a range :\n");
107543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich		fprintf(output, "%s", shift);
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "From ");
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->index >= 0)
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "index %d in ", cur->index);
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "node\n");
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user,
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              depth + 1);
108243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich		fprintf(output, "%s", shift);
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "To ");
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->index2 >= 0)
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "index %d in ", cur->index2);
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "node\n");
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2,
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              depth + 1);
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "\n");
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED)
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a Location Set:\n");
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpLocationSet(output,
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlLocationSetPtr) cur->user, depth);
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is user defined\n");
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp,
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     xmlXPathStepOpPtr op, int depth) {
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
111543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich    fprintf(output, "%s", shift);
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op == NULL) {
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Step is NULL\n");
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "END"); break;
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_AND:
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "AND"); break;
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_OR:
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "OR"); break;
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_EQUAL:
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value)
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "EQUAL =");
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "EQUAL !=");
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_CMP:
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value)
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "CMP <");
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "CMP >");
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (!op->value2)
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "=");
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PLUS:
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value == 0)
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS -");
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 1)
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS +");
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 2)
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS unary -");
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 3)
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS unary - -");
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_MULT:
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value == 0)
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "MULT *");
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 1)
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "MULT div");
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "MULT mod");
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "UNION"); break;
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "ROOT"); break;
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "NODE"); break;
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "RESET"); break;
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "SORT"); break;
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT: {
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value;
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathTestVal test = (xmlXPathTestVal)op->value2;
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3;
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *prefix = op->value4;
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *name = op->value5;
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "COLLECT ");
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (axis) {
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_ANCESTOR:
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'ancestors' "); break;
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_ANCESTOR_OR_SELF:
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'ancestors-or-self' "); break;
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_ATTRIBUTE:
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'attributes' "); break;
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_CHILD:
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'child' "); break;
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_DESCENDANT:
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'descendant' "); break;
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_DESCENDANT_OR_SELF:
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'descendant-or-self' "); break;
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_FOLLOWING:
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'following' "); break;
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_FOLLOWING_SIBLING:
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'following-siblings' "); break;
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_NAMESPACE:
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'namespace' "); break;
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_PARENT:
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'parent' "); break;
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_PRECEDING:
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'preceding' "); break;
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_PRECEDING_SIBLING:
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'preceding-sibling' "); break;
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_SELF:
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'self' "); break;
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (test) {
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NONE:
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'none' "); break;
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_TYPE:
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'type' "); break;
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_PI:
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'PI' "); break;
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_ALL:
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'all' "); break;
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NS:
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'namespace' "); break;
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NAME:
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'name' "); break;
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (type) {
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_NODE:
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'node' "); break;
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_COMMENT:
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'comment' "); break;
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_TEXT:
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'text' "); break;
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_PI:
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'PI' "); break;
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prefix != NULL)
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "%s:", prefix);
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "%s", (const char *) name);
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_VALUE: {
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4;
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ELEM ");
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpObject(output, object, 0);
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto finish;
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_VARIABLE: {
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *prefix = op->value5;
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *name = op->value4;
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prefix != NULL)
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "VARIABLE %s:%s", prefix, name);
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "VARIABLE %s", name);
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_FUNCTION: {
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int nbargs = op->value;
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *prefix = op->value5;
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *name = op->value4;
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prefix != NULL)
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "FUNCTION %s:%s(%d args)",
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prefix, name, nbargs);
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "FUNCTION %s(%d args)", name, nbargs);
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ARG: fprintf(output, "ARG"); break;
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break;
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_FILTER: fprintf(output, "FILTER"); break;
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break;
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "UNKNOWN %d\n", op->op); return;
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfinish:
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 >= 0)
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1);
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 >= 0)
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1);
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpCompExpr:
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the FILE * for the output
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the precompiled XPath expression
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth:  the indentation level.
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the tree of the compiled XPath expression.
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp,
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                  int depth) {
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((output == NULL) || (comp == NULL)) return;
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
130243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich    fprintf(output, "%s", shift);
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Compiled Expression : %d elements\n",
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->nbStep);
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = comp->last;
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1);
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XPath object usage related debugging variables.
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUndefined = 0;
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNodeset = 0;
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterBool = 0;
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNumber = 0;
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterString = 0;
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterPoint = 0;
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterRange = 0;
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterLocset = 0;
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUsers = 0;
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterXSLTTree = 0;
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterAll = 0;
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUndefined = 0;
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNodeset = 0;
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalBool = 0;
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNumber = 0;
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalString = 0;
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalPoint = 0;
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalRange = 0;
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalLocset = 0;
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUsers = 0;
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalXSLTTree = 0;
133760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int xmlXPathDebugObjTotalAll = 0;
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUndefined = 0;
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNodeset = 0;
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxBool = 0;
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNumber = 0;
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxString = 0;
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxPoint = 0;
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxRange = 0;
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxLocset = 0;
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUsers = 0;
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxXSLTTree = 0;
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxAll = 0;
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt)
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedAll = 0;
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedNodeset = 0;
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedString = 0;
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedBool = 0;
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedNumber = 0;
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedPoint = 0;
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedRange = 0;
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedLocset = 0;
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedUsers = 0;
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedXSLTTree = 0;
137060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    cache->dbgCachedUndefined = 0;
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedAll = 0;
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedNodeset = 0;
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedString = 0;
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedBool = 0;
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedNumber = 0;
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedPoint = 0;
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedRange = 0;
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedLocset = 0;
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedUsers = 0;
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedXSLTTree = 0;
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedUndefined = 0;
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
138460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterUndefined = 0;
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterNodeset = 0;
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterBool = 0;
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterNumber = 0;
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterString = 0;
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterPoint = 0;
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterRange = 0;
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterLocset = 0;
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterUsers = 0;
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterXSLTTree = 0;
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterAll = 0;
139760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalUndefined = 0;
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalNodeset = 0;
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalBool = 0;
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalNumber = 0;
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalString = 0;
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalPoint = 0;
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalRange = 0;
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalLocset = 0;
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalUsers = 0;
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalXSLTTree = 0;
140860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathDebugObjTotalAll = 0;
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxUndefined = 0;
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxNodeset = 0;
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxBool = 0;
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxNumber = 0;
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxString = 0;
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxPoint = 0;
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxRange = 0;
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxLocset = 0;
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxUsers = 0;
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxXSLTTree = 0;
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxAll = 0;
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt,
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathObjectType objType)
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isCached = 0;
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
143460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isCached = 1;
143660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
143760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    cache->dbgReusedAll++;
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (objType) {
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_UNDEFINED:
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedUndefined++;
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedNodeset++;
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedBool++;
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedNumber++;
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedString++;
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedPoint++;
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedRange++;
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedLocset++;
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedUsers++;
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedXSLTTree++;
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
147160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (objType) {
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_UNDEFINED:
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalUndefined++;
147960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterUndefined++;
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterUndefined >
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUndefined)
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUndefined =
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterUndefined;
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalNodeset++;
148860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterNodeset++;
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterNodeset >
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNodeset)
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNodeset =
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterNodeset;
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_BOOLEAN:
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalBool++;
149760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterBool++;
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterBool >
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxBool)
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxBool =
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterBool;
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER:
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalNumber++;
150660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterNumber++;
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterNumber >
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNumber)
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNumber =
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterNumber;
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalString++;
151560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterString++;
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterString >
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxString)
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxString =
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterString;
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalPoint++;
152460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterPoint++;
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterPoint >
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxPoint)
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxPoint =
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterPoint;
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalRange++;
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterRange++;
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterRange >
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxRange)
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxRange =
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterRange;
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalLocset++;
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterLocset++;
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterLocset >
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxLocset)
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxLocset =
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterLocset;
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalUsers++;
155160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterUsers++;
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterUsers >
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUsers)
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUsers =
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterUsers;
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalXSLTTree++;
156060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathDebugObjCounterXSLTTree++;
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterXSLTTree >
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxXSLTTree)
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxXSLTTree =
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterXSLTTree;
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! isCached)
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjTotalAll++;
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterAll++;
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathDebugObjCounterAll >
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjMaxAll)
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjMaxAll =
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterAll;
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt,
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathObjectType objType)
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isCached = 0;
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
158960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    isCached = 1;
159060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedAll++;
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (objType) {
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_UNDEFINED:
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedUndefined++;
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedNodeset++;
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedBool++;
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedNumber++;
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedString++;
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedPoint++;
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedRange++;
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedLocset++;
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedUsers++;
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedXSLTTree++;
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
162660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (objType) {
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_UNDEFINED:
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterUndefined--;
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterNodeset--;
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_BOOLEAN:
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterBool--;
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER:
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterNumber--;
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterString--;
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterPoint--;
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterRange--;
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterLocset--;
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterUsers--;
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterXSLTTree--;
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
166260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterAll--;
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt)
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int reqAll, reqNodeset, reqString, reqBool, reqNumber,
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	reqXSLTTree, reqUndefined;
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int caAll = 0, caNodeset = 0, caString = 0, caBool = 0,
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	caNumber = 0, caXSLTTree = 0, caUndefined = 0;
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int reAll = 0, reNodeset = 0, reString = 0, reBool = 0,
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	reNumber = 0, reXSLTTree = 0, reUndefined = 0;
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int leftObjs = xmlXPathDebugObjCounterAll;
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqAll = xmlXPathDebugObjTotalAll;
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqNodeset = xmlXPathDebugObjTotalNodeset;
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqString = xmlXPathDebugObjTotalString;
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqBool = xmlXPathDebugObjTotalBool;
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqNumber = xmlXPathDebugObjTotalNumber;
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqXSLTTree = xmlXPathDebugObjTotalXSLTTree;
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqUndefined = xmlXPathDebugObjTotalUndefined;
168560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# XPath object usage:\n");
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reAll = cache->dbgReusedAll;
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqAll += reAll;
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reNodeset = cache->dbgReusedNodeset;
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqNodeset += reNodeset;
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reString = cache->dbgReusedString;
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqString += reString;
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reBool = cache->dbgReusedBool;
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqBool += reBool;
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reNumber = cache->dbgReusedNumber;
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqNumber += reNumber;
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reXSLTTree = cache->dbgReusedXSLTTree;
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqXSLTTree += reXSLTTree;
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reUndefined = cache->dbgReusedUndefined;
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqUndefined += reUndefined;
170760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caAll = cache->dbgCachedAll;
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caBool = cache->dbgCachedBool;
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caNodeset = cache->dbgCachedNodeset;
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caString = cache->dbgCachedString;
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caNumber = cache->dbgCachedNumber;
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caXSLTTree = cache->dbgCachedXSLTTree;
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caUndefined = cache->dbgCachedUndefined;
171560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->nodesetObjs)
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->nodesetObjs->number;
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->stringObjs)
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->stringObjs->number;
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->booleanObjs)
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->booleanObjs->number;
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->numberObjs)
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->numberObjs->number;
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->miscObjs)
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->miscObjs->number;
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
172860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
172960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    printf("# all\n");
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqAll);
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   left  : %d\n", leftObjs);
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalAll);
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reAll);
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxAll);
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# node-sets\n");
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqNodeset);
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalNodeset);
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reNodeset);
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxNodeset);
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# strings\n");
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqString);
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalString);
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reString);
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxString);
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# booleans\n");
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqBool);
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalBool);
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reBool);
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxBool);
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# numbers\n");
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqNumber);
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalNumber);
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reNumber);
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxNumber);
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# XSLT result tree fragments\n");
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqXSLTTree);
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalXSLTTree);
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reXSLTTree);
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxXSLTTree);
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# undefined\n");
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqUndefined);
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalUndefined);
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reUndefined);
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxUndefined);
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_DEBUG_OBJ_USAGE */
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_DEBUG_ENABLED */
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			XPath object caching				*
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCache:
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new object cache
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCache just allocated.
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathContextCachePtr
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCache(void)
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextCachePtr ret;
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache));
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating object cache\n");
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache));
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxNodeset = 100;
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxString = 100;
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxBoolean = 100;
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxNumber = 100;
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxMisc = 100;
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheFreeObjectList(xmlPointerListPtr list)
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL)
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < list->number; i++) {
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj = list->items[i];
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that it is already assured that we don't need to
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* look out for namespace nodes in the node-set.
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL) {
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodesetval->nodeTab != NULL)
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(obj->nodesetval->nodeTab);
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(obj->nodesetval);
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj);
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjCounterAll--;
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListFree(list);
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCache(xmlXPathContextCachePtr cache)
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache == NULL)
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->nodesetObjs)
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->nodesetObjs);
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->stringObjs)
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->stringObjs);
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->booleanObjs)
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->booleanObjs);
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->numberObjs)
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->numberObjs);
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->miscObjs)
185260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlXPathCacheFreeObjectList(cache->miscObjs);
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(cache);
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContextSetCache:
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @active: enables/disables (creates/frees) the cache
186160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: a value with semantics dependant on @options
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: options (currently only the value 0 is used)
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/frees an object cache on the XPath context.
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If activates XPath objects (xmlXPathObject) will be cached internally
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be reused.
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options:
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   0: This will set the XPath object caching:
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      @value:
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        This will set the maximum number of XPath objects
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        to be cached per slot
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        There are 5 slots for: node-set, string, number, boolean, and
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        misc objects. Use <0 for the default number (100).
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Other values for @options have currently no effect.
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the setting succeeded, and -1 on API or internal errors.
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextSetCache(xmlXPathContextPtr ctxt,
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int active,
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int value,
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int options)
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (active) {
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache;
188860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache == NULL) {
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cache = xmlXPathNewCache();
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->cache == NULL)
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cache = (xmlXPathContextCachePtr) ctxt->cache;
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (options == 0) {
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value < 0)
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = 100;
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxNodeset = value;
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxString = value;
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxNumber = value;
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxBoolean = value;
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxMisc = value;
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->cache != NULL) {
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->cache = NULL;
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapNodeSet:
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapNodeSet().
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val)
192360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache != NULL)) {
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache =
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathContextCachePtr) ctxt->cache;
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->miscObjs != NULL) &&
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
193260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NODESET;
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodesetval = val;
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
194060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return(ret);
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
194360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapNodeSet(val));
194560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapString:
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapString().
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object.
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val)
196060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache != NULL)) {
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->stringObjs != NULL) &&
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->stringObjs->number != 0))
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
196760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
196960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->stringObjs->items[--cache->stringObjs->number];
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = val;
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fallback to misc-cache.
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = val;
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapString(val));
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewNodeSet:
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewNodeSet().
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type NodeSet and initialize
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val)
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->nodesetObjs != NULL) &&
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->nodesetObjs->number != 0))
201860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	{
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Use the nodset-cache.
202260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->nodesetObjs->items[--cache->nodesetObjs->number];
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NODESET;
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = 0;
202760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (val) {
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret->nodesetval->nodeMax == 0) ||
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (val->type == XML_NAMESPACE_DECL))
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
203160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlXPathNodeSetAddUnique(ret->nodesetval, val);
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->nodesetval->nodeTab[0] = val;
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->nodesetval->nodeNr = 1;
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fallback to misc-cache.
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NODESET;
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = 0;
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodesetval = xmlXPathNodeSetCreate(val);
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewNodeSet(val));
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewCString:
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the char * value
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewCString().
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val)
207660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->stringObjs != NULL) &&
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->stringObjs->number != 0))
208260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	{
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
208460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->stringObjs->items[--cache->stringObjs->number];
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = xmlStrdup(BAD_CAST val);
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = xmlStrdup(BAD_CAST val);
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewCString(val));
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewString:
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewString().
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val)
212560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->stringObjs != NULL) &&
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->stringObjs->number != 0))
213160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	{
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
213360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->stringObjs->items[--cache->stringObjs->number];
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val != NULL)
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup(val);
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup((const xmlChar *)"");
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val != NULL)
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup(val);
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup((const xmlChar *)"");
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewString(val));
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewBoolean:
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the boolean value
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewBoolean().
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type boolean and of value @val
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val)
217960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->booleanObjs != NULL) &&
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->booleanObjs->number != 0))
218560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	{
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
218760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->booleanObjs->items[--cache->booleanObjs->number];
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_BOOLEAN;
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = (val != 0);
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN);
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_BOOLEAN;
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = (val != 0);
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN);
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewBoolean(val));
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewFloat:
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the double value
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewFloat().
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type double and of value @val
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val)
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     if ((ctxt != NULL) && (ctxt->cache)) {
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->numberObjs != NULL) &&
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->numberObjs->number != 0))
223360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	{
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
223560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->numberObjs->items[--cache->numberObjs->number];
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NUMBER;
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->floatval = val;
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER);
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NUMBER;
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->floatval = val;
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER);
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewFloat(val));
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertString:
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertString().
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (cached)
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         (or the operation is done directly on @val)
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) {
227760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlChar *res = NULL;
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewCString(ctxt, ""));
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n");
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNodeSetToString(val->nodesetval);
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastBooleanToString(val->boolval);
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNumberToString(val->floatval);
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt, val);
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res == NULL)
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewCString(ctxt, ""));
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCacheWrapString(ctxt, res));
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheObjectCopy:
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the original object
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathObjectCopy().
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire a copy of a given object
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused created object.
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val)
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (XP_HAS_CACHE(ctxt)) {
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (val->type) {
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheWrapNodeSet(ctxt,
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetMerge(NULL, val->nodesetval)));
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheNewString(ctxt, val->stringval));
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheNewBoolean(ctxt, val->boolval));
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheNewFloat(ctxt, val->floatval));
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathObjectCopy(val));
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertBoolean:
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertBoolean().
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) {
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
236160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewBoolean(ctxt, 0));
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_BOOLEAN)
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val));
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt, val);
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertNumber:
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertNumber().
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) {
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
238560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewFloat(ctxt, 0.0));
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_NUMBER)
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val));
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt, val);
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
239760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *		Parser stacks related functions and macros		*
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2402df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXPathSetFrame:
2403df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an XPath parser context
2404df143a5041f03a22808b59c76698770b74692815Selim Gurun *
2405df143a5041f03a22808b59c76698770b74692815Selim Gurun * Set the callee evaluation frame
2406df143a5041f03a22808b59c76698770b74692815Selim Gurun *
2407df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the previous frame value to be restored once done
2408df143a5041f03a22808b59c76698770b74692815Selim Gurun */
2409df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
2410df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXPathSetFrame(xmlXPathParserContextPtr ctxt) {
2411df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret;
2412df143a5041f03a22808b59c76698770b74692815Selim Gurun
2413df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt == NULL)
2414df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(0);
2415df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret = ctxt->valueFrame;
2416df143a5041f03a22808b59c76698770b74692815Selim Gurun    ctxt->valueFrame = ctxt->valueNr;
2417df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
2418df143a5041f03a22808b59c76698770b74692815Selim Gurun}
2419df143a5041f03a22808b59c76698770b74692815Selim Gurun
2420df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
2421df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXPathPopFrame:
2422df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an XPath parser context
2423df143a5041f03a22808b59c76698770b74692815Selim Gurun * @frame: the previous frame value
2424df143a5041f03a22808b59c76698770b74692815Selim Gurun *
2425df143a5041f03a22808b59c76698770b74692815Selim Gurun * Remove the callee evaluation frame
2426df143a5041f03a22808b59c76698770b74692815Selim Gurun */
2427df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
2428df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXPathPopFrame(xmlXPathParserContextPtr ctxt, int frame) {
2429df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt == NULL)
2430df143a5041f03a22808b59c76698770b74692815Selim Gurun        return;
2431df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->valueNr < ctxt->valueFrame) {
2432df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR);
2433df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
2434df143a5041f03a22808b59c76698770b74692815Selim Gurun    ctxt->valueFrame = frame;
2435df143a5041f03a22808b59c76698770b74692815Selim Gurun}
2436df143a5041f03a22808b59c76698770b74692815Selim Gurun
2437df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePop:
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath evaluation context
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top XPath object from the value stack
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the XPath object just removed
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePop(xmlXPathParserContextPtr ctxt)
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->valueNr <= 0))
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
2452df143a5041f03a22808b59c76698770b74692815Selim Gurun
2453df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->valueNr <= ctxt->valueFrame) {
2454df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR);
2455df143a5041f03a22808b59c76698770b74692815Selim Gurun        return (NULL);
2456df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
2457df143a5041f03a22808b59c76698770b74692815Selim Gurun
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->valueNr--;
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueNr > 0)
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value = ctxt->valueTab[ctxt->valueNr - 1];
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value = NULL;
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->valueTab[ctxt->valueNr];
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->valueTab[ctxt->valueNr] = NULL;
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePush:
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath evaluation context
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the XPath object
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new XPath object on top of the value stack
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the number of items on the value stack
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value)
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (value == NULL)) return(-1);
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueNr >= ctxt->valueMax) {
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathObjectPtr *tmp;
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab,
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             2 * ctxt->valueMax *
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             sizeof(ctxt->valueTab[0]));
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "realloc failed !\n");
2488df143a5041f03a22808b59c76698770b74692815Selim Gurun            ctxt->error = XPATH_MEMORY_ERROR;
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->valueMax *= 2;
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueTab = tmp;
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->valueTab[ctxt->valueNr] = value;
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value = value;
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->valueNr++);
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopBoolean:
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a boolean from the stack, handling conversion if needed.
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) {
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) {
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->type != XPATH_BOOLEAN)
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastToBoolean(obj);
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = obj->boolval;
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNumber:
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a number from the stack, handling conversion if needed.
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNumber (xmlXPathParserContextPtr ctxt) {
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) {
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->type != XPATH_NUMBER)
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastToNumber(obj);
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = obj->floatval;
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopString:
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a string from the stack, handling conversion if needed.
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopString (xmlXPathParserContextPtr ctxt) {
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar * ret;
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) {
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCastToString(obj);	/* this does required strdup */
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: needs refactoring somewhere else */
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->stringval == ret)
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj->stringval = NULL;
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNodeSet:
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a node-set from the stack, handling conversion if needed.
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node-set
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) {
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return(NULL);
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL) {
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlXPathStackIsNodeSet(ctxt)) {
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetTypeError(ctxt);
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = obj->nodesetval;
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* to fix memory leak of not clearing obj->user */
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->boolval && obj->user != NULL)
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeNodeList((xmlNodePtr) obj->user);
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj->nodesetval = NULL;
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopExternal:
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops an external object from the stack, handling conversion if needed.
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the object
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid *
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopExternal (xmlXPathParserContextPtr ctxt) {
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void * ret;
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->value == NULL)) {
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value->type != XPATH_USERS) {
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetTypeError(ctxt);
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = obj->user;
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj->user = NULL;
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macros for accessing the content. Those should be used only by the parser,
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and not exported.
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dirty macros, i.e. one need to make assumption on the context to use them
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CUR_PTR return the current pointer to the xmlChar to be parsed.
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CUR     returns the current xmlChar value, i.e. a 8 bit value
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           in ISO-Latin or UTF-8.
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           This should be used internally by the parser
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           only to compare to ASCII values otherwise it would break when
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           running with UTF-8 encoding.
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   NXT(n)  returns the n'th next xmlChar. Same as CUR is should be used only
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           to compare on ASCII based substring.
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           strings within the parser.
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CURRENT Returns the current char value, with the full decoding of
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           UTF-8 if we are using this mode. It returns an int.
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   NEXT    Skip to the next character, this does the proper decoding
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           in UTF-8 mode. It also pop-up unfinished entities on the fly.
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           It returns the pointer to the current xmlChar.
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur)
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->cur += (val)
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->cur[(val)]
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->cur
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l)
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define COPY_BUF(l,b,i,v)                                              \
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (l == 1) b[i++] = (xmlChar) v;                                  \
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else i += xmlCopyChar(l,&b[i],v)
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l)  ctxt->cur += l
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
267960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define SKIP_BLANKS							\
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*(ctxt->cur))) NEXT
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT (*ctxt->cur)
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ((*ctxt->cur) ?  ctxt->cur++: ctxt->cur)
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_DIG
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_DIG 16
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_EPSILON
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_EPSILON 1E-9
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UPPER_DOUBLE 1E9
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LOWER_DOUBLE 1E-5
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define	LOWER_DOUBLE_EXP 5
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INTEGER_DIGITS DBL_DIG
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP))
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EXPONENT_DIGITS (3 + 2)
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFormatNumber:
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @number:     number to format
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:     output buffer
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffersize: size of output buffer
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the number into a string representation.
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFormatNumber(double number, char buffer[], int buffersize)
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (xmlXPathIsInf(number)) {
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 1:
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffersize > (int)sizeof("Infinity"))
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "Infinity");
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case -1:
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffersize > (int)sizeof("-Infinity"))
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "-Infinity");
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    default:
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(number)) {
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (buffersize > (int)sizeof("NaN"))
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(buffer, buffersize, "NaN");
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (number == 0 && xmlXPathGetSign(number) != 0) {
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "0");
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (number == ((int) number)) {
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char work[30];
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *ptr, *cur;
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int value = (int) number;
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ptr = &buffer[0];
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value == 0) {
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ptr++ = '0';
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(work, 29, "%d", value);
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = &work[0];
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*cur) && (ptr - buffer < buffersize)) {
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *ptr++ = *cur++;
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ptr - buffer < buffersize) {
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ptr = 0;
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (buffersize > 0) {
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ptr--;
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ptr = 0;
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      For the dimension of work,
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	          DBL_DIG is number of significant digits
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  EXPONENT is only needed for "scientific notation"
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	          3 is sign, decimal point, and terminating zero
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  LOWER_DOUBLE_EXP is max number of leading zeroes in fraction
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      Note that this dimension is slightly (a few characters)
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      larger than actually necessary.
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char work[DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP];
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int integer_place, fraction_place;
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *ptr;
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *after_fraction;
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    double absolute_value;
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int size;
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    absolute_value = fabs(number);
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * First choose format - scientific or regular floating point.
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * In either case, result is in work, and after_fraction points
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * just past the fractional part.
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ((absolute_value > UPPER_DOUBLE) ||
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (absolute_value < LOWER_DOUBLE)) &&
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (absolute_value != 0.0) ) {
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Use scientific notation */
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fraction_place = DBL_DIG - 1;
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = snprintf(work, sizeof(work),"%*.*e",
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 integer_place, fraction_place, number);
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((size > 0) && (work[size] != 'e')) size--;
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Use regular notation */
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (absolute_value > 0.0) {
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    integer_place = (int)log10(absolute_value);
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (integer_place > 0)
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        fraction_place = DBL_DIG - integer_place - 1;
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        fraction_place = DBL_DIG - integer_place;
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fraction_place = 1;
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = snprintf(work, sizeof(work), "%0.*f",
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				fraction_place, number);
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove fractional trailing zeroes */
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    after_fraction = work + size;
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ptr = after_fraction;
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (*(--ptr) == '0')
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		;
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*ptr != '.')
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ptr++;
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*ptr++ = *after_fraction++) != 0);
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Finally copy result back to caller */
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    size = strlen(work) + 1;
280948d0ed6753beba44f3aa579be29278eecdca10adSelim Gurun	    if (size > buffersize && buffersize <= (int)sizeof(work)) {
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		work[buffersize - 1] = 0;
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = buffersize;
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memmove(buffer, work, size);
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Routines to handle NodeSets			*
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathOrderDocElems:
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  an input document
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Call this routine to speed up XPath computation on static documents.
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This stamps all the element nodes with the document order
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Like for line information, the order is kept in the element->content
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field, the value stored is actually - the node number (starting at -1)
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be able to differentiate from line numbers.
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of elements found in the document or -1 in case
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    of error.
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectlong
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathOrderDocElems(xmlDocPtr doc) {
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long count = 0;
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = doc->children;
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->type == XML_ELEMENT_NODE) {
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur->content = (void *) (-(++count));
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->children != NULL) {
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->children;
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->next != NULL) {
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->parent;
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == NULL)
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == (xmlNodePtr) doc) {
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = NULL;
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->next != NULL) {
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(count);
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodes:
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1:  the first node
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2:  the second node
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it's the same node, -1 otherwise
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth1, depth2;
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int attr1 = 0, attr2 = 0;
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr attrNode1 = NULL, attrNode2 = NULL;
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, root;
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1 == NULL) || (node2 == NULL))
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a couple of optimizations which will avoid computations in most cases
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2)		/* trivial case */
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1->type == XML_ATTRIBUTE_NODE) {
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr1 = 1;
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrNode1 = node1;
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node2->type == XML_ATTRIBUTE_NODE) {
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr2 = 1;
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrNode2 = node2;
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2) {
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr1 == attr2) {
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* not required, but we keep attributes in order */
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr1 != 0) {
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        cur = attrNode2->prev;
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur == attrNode1)
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return (1);
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->prev;
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr2 == 1)
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_NAMESPACE_DECL) ||
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (node2->type == XML_NAMESPACE_DECL))
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node1->doc == node2->doc)) {
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	long l1, l2;
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * compute depth to root
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) {
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node1)
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2++;
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = cur;
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) {
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1++;
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Distinct document (or distinct entities :-( ) case.
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root != cur) {
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * get the nearest common ancestor.
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth1 > depth2) {
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1--;
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth2 > depth1) {
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2--;
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node1->parent != node2->parent) {
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* should not happen but just in case ... */
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((node1 == NULL) || (node2 == NULL))
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-2);
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Find who's first.
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node1->doc == node2->doc)) {
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	long l1, l2;
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = node1->next;cur != NULL;cur = cur->next)
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1); /* assume there is no sibling list corruption */
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodesExt:
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1:  the first node
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2:  the second node
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order.
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is optimized for handling of non-element nodes.
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it's the same node, -1 otherwise
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth1, depth2;
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int misc = 0, precedence1 = 0, precedence2 = 0;
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr miscNode1 = NULL, miscNode2 = NULL;
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, root;
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long l1, l2;
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1 == NULL) || (node2 == NULL))
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2)
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
304860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a couple of optimizations which will avoid computations in most cases
305160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     */
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node1->type) {
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node2->type == XML_ELEMENT_NODE) {
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (0 > (long) node2->content) &&
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (node1->doc == node2->doc))
305860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		{
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    l1 = -((long) node1->content);
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    l2 = -((long) node2->content);
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (l1 < l2)
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (l1 > l2)
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
306660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    goto turtle_comparison;
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    precedence1 = 1; /* element is owner */
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode1 = node1;
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node1 = node1->parent;
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    misc = 1;
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE: {
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode1 = node1;
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Find nearest element node.
308260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node1->prev != NULL) {
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node1 = node1->prev;
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node1->type == XML_ELEMENT_NODE) {
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence1 = 3; /* element in prev-sibl axis */
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node1->prev == NULL) {
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence1 = 2; /* element is parent */
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* URGENT TODO: Are there any cases, where the
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* parent of such a node is not an element node?
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			node1 = node1->parent;
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (1);
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence1 = 2; /* element is parent */
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node1 = node1->parent;
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) ||
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(0 <= (long) node1->content)) {
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Fallback for whatever case.
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node1 = miscNode1;
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence1 = 0;
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		misc = 1;
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: why do we return 1 for namespace nodes?
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
312260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node2->type) {
312460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	case XML_ELEMENT_NODE:
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    precedence2 = 1; /* element is owner */
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode2 = node2;
3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node2 = node2->parent;
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    misc = 1;
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE: {
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode2 = node2;
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node2->prev != NULL) {
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node2 = node2->prev;
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node2->type == XML_ELEMENT_NODE) {
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence2 = 3; /* element in prev-sibl axis */
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node2->prev == NULL) {
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence2 = 2; /* element is parent */
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			node2 = node2->parent;
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (1);
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence2 = 2; /* element is parent */
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node2 = node2->parent;
315360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) ||
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(0 <= (long) node1->content))
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node2 = miscNode2;
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence2 = 0;
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		misc = 1;
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (misc) {
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node1 == node2) {
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (precedence1 == precedence2) {
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The ugly case; but normally there aren't many
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* adjacent non-element nodes around.
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = miscNode2->prev;
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur == miscNode1)
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->type == XML_ELEMENT_NODE)
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->prev;
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Evaluate based on higher precedence wrt to the element.
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: This assumes attributes are sorted before content.
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   Is this 100% correct?
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (precedence1 < precedence2)
319160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    return(1);
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
319360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    return(-1);
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
319560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Special case: One of the helper-elements is contained by the other.
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <foo>
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   <node2>
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*     <node1>Text-1(precedence1 == 2)</node1>
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   </node2>
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   Text-6(precedence2 == 3)
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* </foo>
320460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((precedence2 == 3) && (precedence1 > 1)) {
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = node1->parent;
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur) {
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur == node2)
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->parent;
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
321360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if ((precedence1 == 3) && (precedence2 > 1)) {
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = node2->parent;
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur) {
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur == node1)
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->parent;
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
322160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
322660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((node1->type == XML_ELEMENT_NODE) &&
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
323060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	(node1->doc == node2->doc)) {
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectturtle_comparison:
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * compute depth to root
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) {
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node1)
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2++;
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = cur;
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) {
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1++;
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Distinct document (or distinct entities :-( ) case.
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root != cur) {
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * get the nearest common ancestor.
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth1 > depth2) {
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1--;
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth2 > depth1) {
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2--;
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node1->parent != node2->parent) {
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* should not happen but just in case ... */
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((node1 == NULL) || (node2 == NULL))
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-2);
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Find who's first.
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
329860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	(node1->doc == node2->doc)) {
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = node1->next;cur != NULL;cur = cur->next)
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1); /* assume there is no sibling list corruption */
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetSort:
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set:  the node set
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sort the node set in document order
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetSort(xmlNodeSetPtr set) {
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, incr, len;
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp;
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set == NULL)
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Use Shell's sort to sort the node-set */
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = set->nodeNr;
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (incr = len / 2; incr > 0; incr /= 2) {
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = incr; i < len; i++) {
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    j = i - incr;
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (j >= 0) {
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlXPathCmpNodesExt(set->nodeTab[j],
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set->nodeTab[j + incr]) == -1)
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlXPathCmpNodes(set->nodeTab[j],
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set->nodeTab[j + incr]) == -1)
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = set->nodeTab[j];
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeTab[j] = set->nodeTab[j + incr];
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeTab[j + incr] = tmp;
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    j -= incr;
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NODESET_DEFAULT	10
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDupNs:
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the parent node of the namespace XPath node
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the libxml namespace declaration node.
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace node in libxml don't match the XPath semantic. In a node set
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic.
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) {
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNsPtr cur;
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL))
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((xmlNodePtr) ns);
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate a new Namespace and fill the fields.
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "duplicating namespace\n");
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(cur, 0, sizeof(xmlNs));
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->type = XML_NAMESPACE_DECL;
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns->href != NULL)
338660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	cur->href = xmlStrdup(ns->href);
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns->prefix != NULL)
338860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	cur->prefix = xmlStrdup(ns->prefix);
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->next = (xmlNsPtr) node;
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlNodePtr) cur);
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetFreeNs:
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the XPath namespace node found in a nodeset.
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace nodes in libxml don't match the XPath semantic. In a node set
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic. Check if such a node needs to be freed
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetFreeNs(xmlNsPtr ns) {
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL))
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) {
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns->href != NULL)
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar *)ns->href);
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns->prefix != NULL)
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar *)ns->prefix);
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ns);
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreate:
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an initial xmlNodePtr, or NULL
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreate(xmlNodePtr val) {
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating nodeset\n");
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlNodeSet));
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL) {
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->nodeTab == NULL) {
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "creating nodeset\n");
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(ret->nodeTab, 0 ,
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nodeMax = XML_NODESET_DEFAULT;
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val->type == XML_NAMESPACE_DECL) {
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) val;
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodeTab[ret->nodeNr++] =
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodeTab[ret->nodeNr++] = val;
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreateSize:
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the initial size of the set
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreateSize(int size) {
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating nodeset\n");
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlNodeSet));
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (size < XML_NODESET_DEFAULT)
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	size = XML_NODESET_DEFAULT;
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr));
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->nodeTab == NULL) {
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(NULL, "creating nodeset\n");
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr));
348260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->nodeMax = size;
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetContains:
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the node-set
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the node
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * checks whether @cur contains @val
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @cur contains @val, false (0) otherwise
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) {
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return(0);
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XML_NAMESPACE_DECL) {
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < cur->nodeNr; i++) {
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) {
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns1, ns2;
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns1 = (xmlNsPtr) val;
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns2 = (xmlNsPtr) cur->nodeTab[i];
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ns1 == ns2)
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ns1->next != NULL) && (ns2->next == ns1->next) &&
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            (xmlStrEqual(ns1->prefix, ns2->prefix)))
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < cur->nodeNr; i++) {
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodeTab[i] == val)
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddNs:
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the hosting node
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a the namespace node
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new namespace node to an existing NodeSet
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) {
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
353560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (ns == NULL) || (node == NULL) ||
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ns->type != XML_NAMESPACE_DECL) ||
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node->type != XML_ELEMENT_NODE))
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * prevent duplicates
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->nodeNr;i++) {
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->nodeTab[i] != NULL) &&
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) &&
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) &&
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix)))
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the nodeTab if needed
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nodeMax == 0) {
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->nodeTab == NULL) {
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->nodeTab, 0 ,
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax = XML_NODESET_DEFAULT;
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->nodeNr == cur->nodeMax) {
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr *temp;
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3569df143a5041f03a22808b59c76698770b74692815Selim Gurun	temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 *
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlNodePtr));
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3575df143a5041f03a22808b59c76698770b74692815Selim Gurun        cur->nodeMax *= 2;
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab = temp;
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns);
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAdd:
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a new xmlNodePtr
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) {
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return;
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' '))
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;	/* an XSLT fake node */
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * prevent duplcates
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->nodeNr;i++)
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->nodeTab[i] == val) return;
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the nodeTab if needed
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nodeMax == 0) {
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->nodeTab == NULL) {
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->nodeTab, 0 ,
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax = XML_NODESET_DEFAULT;
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->nodeNr == cur->nodeMax) {
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr *temp;
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3622df143a5041f03a22808b59c76698770b74692815Selim Gurun	temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 *
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlNodePtr));
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3628df143a5041f03a22808b59c76698770b74692815Selim Gurun        cur->nodeMax *= 2;
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab = temp;
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XML_NAMESPACE_DECL) {
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr ns = (xmlNsPtr) val;
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
363460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	cur->nodeTab[cur->nodeNr++] =
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab[cur->nodeNr++] = val;
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddUnique:
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a new xmlNodePtr
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet, optimized version
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when we are sure the node is not already in the set.
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) {
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return;
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' '))
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;	/* an XSLT fake node */
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the nodeTab if needed
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nodeMax == 0) {
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->nodeTab == NULL) {
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->nodeTab, 0 ,
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax = XML_NODESET_DEFAULT;
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->nodeNr == cur->nodeMax) {
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr *temp;
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3674df143a5041f03a22808b59c76698770b74692815Selim Gurun	temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 *
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlNodePtr));
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab = temp;
3681df143a5041f03a22808b59c76698770b74692815Selim Gurun        cur->nodeMax *= 2;
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XML_NAMESPACE_DECL) {
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr ns = (xmlNsPtr) val;
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
368660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	cur->nodeTab[cur->nodeNr++] =
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab[cur->nodeNr++] = val;
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMerge:
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1:  the first NodeSet or NULL
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2:  the second NodeSet
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error.
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, initNr, skip;
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr n1, n2;
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val2 == NULL) return(val1);
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val1 == NULL) {
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathNodeSetCreate(NULL);
371060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (val1 == NULL)
371160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return (NULL);
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: The optimization won't work in every case, since
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  those nasty namespace nodes need to be added with
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  xmlXPathNodeSetDupNs() to the set; thus a pure
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  memcpy is not possible.
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  If there was a flag on the nodesetval, indicating that
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  some temporary nodes are in, that would be helpfull.
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
372160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Optimization: Create an equally sized node-set
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and memcpy the content.
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathNodeSetCreateSize(val2->nodeNr);
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val1 == NULL)
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val2->nodeNr != 0) {
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val2->nodeNr == 1)
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*(val1->nodeTab) = *(val2->nodeTab);
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memcpy(val1->nodeTab, val2->nodeTab,
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val2->nodeNr * sizeof(xmlNodePtr));
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeNr = val2->nodeNr;
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val1);
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    initNr = val1->nodeNr;
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < val2->nodeNr;i++) {
374560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	n2 = val2->nodeTab[i];
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * check against duplicates
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	skip = 0;
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0; j < initNr; j++) {
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    n1 = val1->nodeTab[j];
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n1 == n2) {
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		skip = 1;
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((n1->type == XML_NAMESPACE_DECL) &&
375660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		       (n2->type == XML_NAMESPACE_DECL)) {
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) &&
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlStrEqual(((xmlNsPtr) n1)->prefix,
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlNsPtr) n2)->prefix)))
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    skip = 1;
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (skip)
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * grow the nodeTab if needed
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val1->nodeMax == 0) {
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    sizeof(xmlNodePtr));
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val1->nodeTab == NULL) {
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(val1->nodeTab, 0 ,
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax = XML_NODESET_DEFAULT;
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (val1->nodeNr == val1->nodeMax) {
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr *temp;
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3785df143a5041f03a22808b59c76698770b74692815Selim Gurun	    temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 2 *
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (temp == NULL) {
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = temp;
3792df143a5041f03a22808b59c76698770b74692815Selim Gurun	    val1->nodeMax *= 2;
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (n2->type == XML_NAMESPACE_DECL) {
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) n2;
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] =
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] = n2;
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val1);
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* xmlXPathNodeSetMergeUnique() is currently not used anymore */
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeUnique:
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1:  the first NodeSet or NULL
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2:  the second NodeSet
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error.
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val2 == NULL) return(val1);
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val1 == NULL) {
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathNodeSetCreate(NULL);
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
382560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (val1 == NULL)
382660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return (NULL);
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < val2->nodeNr;i++) {
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * grow the nodeTab if needed
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val1->nodeMax == 0) {
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    sizeof(xmlNodePtr));
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val1->nodeTab == NULL) {
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(val1->nodeTab, 0 ,
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax = XML_NODESET_DEFAULT;
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (val1->nodeNr == val1->nodeMax) {
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr *temp;
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax *= 2;
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax *
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (temp == NULL) {
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = temp;
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) {
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i];
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] =
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i];
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val1);
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* xmlXPathNodeSetMergeUnique() is currently not used anymore */
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClear:
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1:  the first NodeSet or NULL
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2:  the second NodeSet
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2.
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for duplicate nodes. Clears set2.
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error.
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2,
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int hasNullEntries)
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set1 == NULL) && (hasNullEntries == 0)) {
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that doing a memcpy of the list, namespace nodes are
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* just assigned to set1, since set2 is cleared anyway.
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set1 = xmlXPathNodeSetCreateSize(set2->nodeNr);
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set2->nodeNr != 0) {
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memcpy(set1->nodeTab, set2->nodeTab,
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set2->nodeNr * sizeof(xmlNodePtr));
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1->nodeNr = set2->nodeNr;
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, initNbSet1;
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr n1, n2;
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
390360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            set1 = xmlXPathNodeSetCreate(NULL);
390460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        if (set1 == NULL)
390560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            return (NULL);
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
390760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	initNbSet1 = set1->nodeNr;
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < set2->nodeNr;i++) {
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    n2 = set2->nodeTab[i];
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip NULLed entries.
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n2 == NULL)
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip duplicates.
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < initNbSet1; j++) {
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		n1 = set1->nodeTab[j];
392060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (n1 == n2) {
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto skip_node;
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((n1->type == XML_NAMESPACE_DECL) &&
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (n2->type == XML_NAMESPACE_DECL))
392460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		{
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) &&
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlStrEqual(((xmlNsPtr) n1)->prefix,
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlNsPtr) n2)->prefix)))
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Free the namespace node.
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set2->nodeTab[i] = NULL;
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathNodeSetFreeNs((xmlNsPtr) n2);
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto skip_node;
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * grow the nodeTab if needed
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set1->nodeMax == 0) {
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = (xmlNodePtr *) xmlMalloc(
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * sizeof(xmlNodePtr));
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (set1->nodeTab == NULL) {
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memset(set1->nodeTab, 0,
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeMax = XML_NODESET_DEFAULT;
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (set1->nodeNr >= set1->nodeMax) {
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr *temp;
395360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		temp = (xmlNodePtr *) xmlRealloc(
3955df143a5041f03a22808b59c76698770b74692815Selim Gurun		    set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr));
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (temp == NULL) {
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = temp;
3961df143a5041f03a22808b59c76698770b74692815Selim Gurun		set1->nodeMax *= 2;
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n2->type == XML_NAMESPACE_DECL) {
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = (xmlNsPtr) n2;
396560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab[set1->nodeNr++] =
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab[set1->nodeNr++] = n2;
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectskip_node:
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {}
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set2->nodeNr = 0;
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(set1);
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClearNoDupls:
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1:  the first NodeSet or NULL
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2:  the second NodeSet
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2.
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Doesn't chack for duplicate nodes. Clears set2.
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error.
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2,
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    int hasNullEntries)
399360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set2 == NULL)
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(set1);
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set1 == NULL) && (hasNullEntries == 0)) {
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that doing a memcpy of the list, namespace nodes are
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* just assigned to set1, since set2 is cleared anyway.
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set1 = xmlXPathNodeSetCreateSize(set2->nodeNr);
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set2->nodeNr != 0) {
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memcpy(set1->nodeTab, set2->nodeTab,
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set2->nodeNr * sizeof(xmlNodePtr));
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1->nodeNr = set2->nodeNr;
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr n2;
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1 = xmlXPathNodeSetCreate(NULL);
401560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        if (set1 == NULL)
401660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            return (NULL);
401760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < set2->nodeNr;i++) {
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    n2 = set2->nodeTab[i];
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip NULLed entries.
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n2 == NULL)
402460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set1->nodeMax == 0) {
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = (xmlNodePtr *) xmlMalloc(
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * sizeof(xmlNodePtr));
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (set1->nodeTab == NULL) {
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memset(set1->nodeTab, 0,
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeMax = XML_NODESET_DEFAULT;
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (set1->nodeNr >= set1->nodeMax) {
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr *temp;
403760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		temp = (xmlNodePtr *) xmlRealloc(
4039df143a5041f03a22808b59c76698770b74692815Selim Gurun		    set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr));
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (temp == NULL) {
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = temp;
4045df143a5041f03a22808b59c76698770b74692815Selim Gurun		set1->nodeMax *= 2;
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1->nodeTab[set1->nodeNr++] = n2;
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set2->nodeNr = 0;
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(set1);
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDel:
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an xmlNodePtr
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an xmlNodePtr from an existing NodeSet
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) {
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return;
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) return;
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * find node in nodeTab
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->nodeNr;i++)
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->nodeTab[i] == val) break;
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (i >= cur->nodeNr) {	/* not found */
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
407660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        xmlGenericError(xmlGenericErrorContext,
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n",
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val->name);
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodeTab[i] != NULL) &&
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->nodeTab[i]->type == XML_NAMESPACE_DECL))
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]);
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeNr--;
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (;i < cur->nodeNr;i++)
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab[i] = cur->nodeTab[i + 1];
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeTab[cur->nodeNr] = NULL;
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetRemove:
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the index to remove
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an entry from an existing NodeSet list.
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) {
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return;
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val >= cur->nodeNr) return;
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodeTab[val] != NULL) &&
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->nodeTab[val]->type == XML_NAMESPACE_DECL))
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]);
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeNr--;
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (;val < cur->nodeNr;val++)
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab[val] = cur->nodeTab[val + 1];
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeTab[cur->nodeNr] = NULL;
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSet:
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlNodeSetPtr to free
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound (not the actual nodes !).
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSet(xmlNodeSetPtr obj) {
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeTab != NULL) {
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* @@ with_ns to check whether namespace nodes should be looked at @@ */
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < obj->nodeNr;i++)
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((obj->nodeTab[i] != NULL) &&
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(obj->nodeTab[i]->type == XML_NAMESPACE_DECL))
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj->nodeTab);
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClear:
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set:  the node set to clear
413660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from all temporary XPath objects (e.g. namespace nodes
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed), but does *not* free the list itself. Sets the length of the
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * list to 0.
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes)
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set == NULL) || (set->nodeNr <= 0))
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (hasNsNodes) {
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr node;
414960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < set->nodeNr; i++) {
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = set->nodeTab[i];
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node != NULL) &&
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(node->type == XML_NAMESPACE_DECL))
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetFreeNs((xmlNsPtr) node);
415560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set->nodeNr = 0;
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClearFromPos:
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set to be cleared
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pos: the start position to clear from
416460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from temporary XPath objects (e.g. namespace nodes
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed) starting with the entry at @pos, but does *not* free the list
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * itself. Sets the length of the list to @pos.
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes)
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr))
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((hasNsNodes)) {
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr node;
417760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = pos; i < set->nodeNr; i++) {
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = set->nodeTab[i];
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node != NULL) &&
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(node->type == XML_NAMESPACE_DECL))
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetFreeNs((xmlNsPtr) node);
418360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set->nodeNr = pos;
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeValueTree:
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlNodeSetPtr to free
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound and the actual tree, this is different
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from xmlXPathFreeNodeSet()
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj) {
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeTab != NULL) {
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < obj->nodeNr;i++) {
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodeTab[i] != NULL) {
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) {
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFreeNodeList(obj->nodeTab[i]);
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj->nodeTab);
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(DEBUG) || defined(DEBUG_STEP)
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGenericErrorContextNodeSet:
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  a FILE * for the output
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlNodeSetPtr to display
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Quick display of a NodeSet
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) {
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL) output = xmlGenericErrorContext;
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL)  {
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "NodeSet == NULL !\n");
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeNr == 0) {
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "NodeSet is empty\n");
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeTab == NULL) {
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " nodeTab == NULL !\n");
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < obj->nodeNr; i++) {
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (obj->nodeTab[i] == NULL) {
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " NULL !\n");
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) ||
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE))
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " /");
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (obj->nodeTab[i]->name == NULL)
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " noname!");
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else fprintf(output, " %s", obj->nodeTab[i]->name);
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSet:
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSet(xmlNodePtr val) {
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating nodeset\n");
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_NODESET;
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->boolval = 0;
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodesetval = xmlXPathNodeSetCreate(val);
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET);
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewValueTree:
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the tree root @val
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewValueTree(xmlNodePtr val) {
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating result value tree\n");
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_XSLT_TREE;
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->boolval = 1;
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = (void *) val;
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodesetval = xmlXPathNodeSetCreate(val);
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE);
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSetList:
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an existing NodeSet
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the Nodeset @val
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSetList(xmlNodeSetPtr val)
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = NULL;
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (val->nodeTab == NULL)
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlXPathNewNodeSet(NULL);
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlXPathNewNodeSet(val->nodeTab[0]);
433660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        if (ret)
433760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            for (i = 1; i < val->nodeNr; ++i)
433860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]);
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapNodeSet:
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapNodeSet(xmlNodeSetPtr val) {
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating node set object\n");
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_NODESET;
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodesetval = val;
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET);
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSetList:
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  an existing NodeSetList object
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the list contrary to xmlXPathFreeObject().
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) {
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageReleased(NULL, obj->type);
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDifference:
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets difference() function:
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:difference (node-set, node-set)
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the difference between the two node sets, or nodes1 if
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         nodes2 is empty
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l1;
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l1 = xmlXPathNodeSetGetLength(nodes1);
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l1; i++) {
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes1, i);
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!xmlXPathNodeSetContains(nodes2, cur))
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique(ret, cur);
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIntersection:
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets intersection() function:
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:intersection (node-set, node-set)
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node set comprising the nodes that are within both the
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         node sets passed as arguments
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l1;
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
443760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
443860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(ret);
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l1 = xmlXPathNodeSetGetLength(nodes1);
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l1; i++) {
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes1, i);
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathNodeSetContains(nodes2, cur))
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique(ret, cur);
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinctSorted:
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set, sorted by document order
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function:
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:distinct (node-set)
446060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it is empty
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinctSorted (xmlNodeSetPtr nodes) {
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr hash;
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar * strval;
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes))
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
447660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
447760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(ret);
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes);
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hash = xmlHashCreate (l);
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l; i++) {
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes, i);
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	strval = xmlXPathCastNodeToString(cur);
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlHashLookup(hash, strval) == NULL) {
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlHashAddEntry(hash, strval, strval);
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique(ret, cur);
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(strval);
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(hash, (xmlHashDeallocator) xmlFree);
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinct:
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function:
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:distinct (node-set)
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsDistinctSorted
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called with the sorted node-set
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it is empty
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinct (xmlNodeSetPtr nodes) {
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes))
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes);
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathDistinctSorted(nodes));
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathHasSameNodes:
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets has-same-nodes function:
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean set:has-same-node(node-set, node-set)
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @nodes1 shares any node with @nodes2, false (0)
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         otherwise
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1) ||
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetIsEmpty(nodes2))
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes1);
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l; i++) {
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes1, i);
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathNodeSetContains(nodes2, cur))
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeadingSorted:
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order,
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) {
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
456660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
456760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(ret);
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes) ||
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlXPathNodeSetContains(nodes, node)))
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes);
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l; i++) {
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes, i);
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node)
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetAddUnique(ret, cur);
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeading:
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called.
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order,
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) {
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes);
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeLeadingSorted(nodes, node));
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeadingSorted:
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set, sorted by document order
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set, sorted by document order
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeLeadingSorted(nodes1,
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlXPathNodeSetItem(nodes2, 1)));
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeading:
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #exslSetsLeadingSorted is called.
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNodeSetCreate(NULL));
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes1);
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes2);
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeLeadingSorted(nodes1,
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlXPathNodeSetItem(nodes2, 1)));
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailingSorted:
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order,
4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) {
4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
467060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
467160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(ret);
4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes) ||
4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlXPathNodeSetContains(nodes, node)))
4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes);
4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = l - 1; i >= 0; i--) {
4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes, i);
4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node)
4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetAddUnique(ret, cur);
4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(ret);	/* bug 413451 */
4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailing:
4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set
4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted
4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called.
4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order,
4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) {
4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes);
4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeTrailingSorted(nodes, node));
4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailingSorted:
4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set, sorted by document order
4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set, sorted by document order
4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2
4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeTrailingSorted(nodes1,
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlXPathNodeSetItem(nodes2, 0)));
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailing:
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #xmlXPathTrailingSorted is called.
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNodeSetCreate(NULL));
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes1);
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes2);
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeTrailingSorted(nodes1,
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlXPathNodeSetItem(nodes2, 0)));
4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Routines to handle extra functions			*
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFunc:
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the function implementation or NULL
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
476960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name,
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlXPathFunction f) {
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f));
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncNS:
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the function namespace URI
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the function implementation or NULL
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *ns_uri, xmlXPathFunction f) {
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcHash == NULL)
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->funcHash = xmlHashCreate(0);
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcHash == NULL)
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (f == NULL)
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL));
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, XML_CAST_FPTR(f)));
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncLookup:
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the lookup function
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @funcCtxt:  the lookup data
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers an external mechanism to do function lookup.
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFuncLookupFunc f,
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    void *funcCtxt) {
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->funcLookupFunc = f;
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->funcLookupData = funcCtxt;
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookup:
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function.
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) {
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcLookupFunc != NULL) {
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFunction ret;
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFuncLookupFunc f;
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	f = ctxt->funcLookupFunc;
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = f(ctxt->funcLookupData, name, NULL);
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL)
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathFunctionLookupNS(ctxt, name, NULL));
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookupNS:
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the function namespace URI
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function.
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *ns_uri) {
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFunction ret;
486360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcLookupFunc != NULL) {
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFuncLookupFunc f;
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	f = ctxt->funcLookupFunc;
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = f(ctxt->funcLookupData, name, ns_uri);
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL)
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcHash == NULL)
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->funcHash, name, ns_uri);
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredFuncsCleanup:
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered functions
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) {
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(ctxt->funcHash, NULL);
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->funcHash = NULL;
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Routines to handle Variables			*
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariable:
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the variable value or NULL
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters
4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
491760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name,
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlXPathObjectPtr value) {
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value));
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableNS:
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the variable namespace URI
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the variable value or NULL
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *ns_uri,
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathObjectPtr value) {
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varHash == NULL)
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->varHash = xmlHashCreate(0);
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varHash == NULL)
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
494960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri,
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                           (xmlHashDeallocator)xmlXPathFreeObject));
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri,
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       (void *) value,
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       (xmlHashDeallocator)xmlXPathFreeObject));
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableLookup:
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the lookup function
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  the lookup data
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * register an external mechanism to do variable lookup
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt,
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlXPathVariableLookupFunc f, void *data) {
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->varLookupFunc = f;
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->varLookupData = data;
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookup:
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * variable value.
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a copy of the value or NULL if not found
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) {
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varLookupFunc != NULL) {
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr ret;
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (ctxt->varLookupData, name, NULL);
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathVariableLookupNS(ctxt, name, NULL));
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookupNS:
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the variable namespace URI
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given
500560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * variable value.
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the a copy of the value or NULL if not found
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name,
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *ns_uri) {
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varLookupFunc != NULL) {
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr ret;
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (ctxt->varLookupData, name, ns_uri);
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL) return(ret);
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varHash == NULL)
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr)
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlHashLookup2(ctxt->varHash, name, ns_uri)));
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredVariablesCleanup:
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) {
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject);
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->varHash = NULL;
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterNs:
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5050df143a5041f03a22808b59c76698770b74692815Selim Gurun * @prefix:  the namespace prefix cannot be NULL or empty string
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the namespace name
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new namespace. If @ns_uri is NULL it unregisters
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix,
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *ns_uri) {
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix == NULL)
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5065df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (prefix[0] == 0)
5066df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(-1);
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nsHash == NULL)
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->nsHash = xmlHashCreate(10);
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nsHash == NULL)
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns_uri == NULL)
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlHashRemoveEntry(ctxt->nsHash, prefix,
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                          (xmlHashDeallocator)xmlFree));
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri),
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      (xmlHashDeallocator)xmlFree));
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNsLookup:
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix:  the namespace prefix value
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the namespace declaration array of the context for the given
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace name associated to the given prefix
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value or NULL if not found
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) {
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix == NULL)
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_XML_NAMESPACE
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(prefix, (const xmlChar *) "xml"))
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(XML_XML_NAMESPACE);
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->namespaces != NULL) {
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ctxt->nsNr;i++) {
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->namespaces[i] != NULL) &&
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlStrEqual(ctxt->namespaces[i]->prefix, prefix)))
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->namespaces[i]->href);
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix));
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredNsCleanup:
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) {
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree);
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nsHash = NULL;
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Routines to handle Values			*
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Allocations are terrible, one needs to optimize all this !!! */
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewFloat:
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the double value
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type double and of value @val
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewFloat(double val) {
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating float object\n");
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_NUMBER;
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->floatval = val;
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER);
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewBoolean:
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the boolean value
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type boolean and of value @val
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewBoolean(int val) {
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating boolean object\n");
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_BOOLEAN;
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->boolval = (val != 0);
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN);
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewString:
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewString(const xmlChar *val) {
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating string object\n");
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_STRING;
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->stringval = xmlStrdup(val);
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->stringval = xmlStrdup((const xmlChar *)"");
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapString:
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object.
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapString (xmlChar *val) {
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating string object\n");
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_STRING;
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->stringval = val;
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCString:
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the char * value
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCString(const char *val) {
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating string object\n");
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_STRING;
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->stringval = xmlStrdup(BAD_CAST val);
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapCString:
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the char * value
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps a string into an XPath object.
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapCString (char * val) {
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapString((xmlChar *)(val)));
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapExternal:
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the user data
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val data into an XPath object.
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapExternal (void *val) {
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating user object\n");
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_USERS;
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = val;
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS);
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathObjectCopy:
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the original object
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate a new copy of a given object
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectCopy(xmlXPathObjectPtr val) {
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "copying object\n");
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, val , (size_t) sizeof(xmlXPathObject));
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, val->type);
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_BOOLEAN:
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER:
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = xmlStrdup(val->stringval);
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  this previous handling is no longer correct, and can cause some serious
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  problems (ref. bug 145547)
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((val->nodesetval != NULL) &&
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(val->nodesetval->nodeTab != NULL)) {
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr cur, tmp;
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDocPtr top;
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->boolval = 1;
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		top =  xmlNewDoc(NULL);
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		top->name = (char *)
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrdup(val->nodesetval->nodeTab[0]->name);
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->user = top;
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (top != NULL) {
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    top->doc = top;
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = val->nodesetval->nodeTab[0]->children;
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (cur != NULL) {
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = xmlDocCopyNode(cur, top, 1);
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAddChild((xmlNodePtr) top, tmp);
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->next;
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top);
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->nodesetval = xmlXPathNodeSetCreate(NULL);
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Deallocate the copied tree value */
5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval);
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Do not deallocate the copied tree value */
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = 0;
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlLocationSetPtr loc = val->user;
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc);
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_USERS:
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user = val->user;
539060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    break;
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_UNDEFINED:
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlXPathObjectCopy: unsupported type %d\n",
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val->type);
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeObject:
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the object to free
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathObjectPtr object.
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeObject(xmlXPathObjectPtr obj) {
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) {
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->boolval) {
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->user != NULL) {
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathFreeNodeSet(obj->nodesetval);
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFreeNodeList((xmlNodePtr) obj->user);
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodesetval != NULL)
541960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlXPathFreeValueTree(obj->nodesetval);
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodesetval != NULL)
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeNodeSet(obj->nodesetval);
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (obj->type == XPATH_LOCATIONSET) {
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->user != NULL)
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrFreeLocationSet(obj->user);
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (obj->type == XPATH_STRING) {
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->stringval != NULL)
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(obj->stringval);
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageReleased(NULL, obj->type);
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
543660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlFree(obj);
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathReleaseObject:
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlXPathObjectPtr to free or to cache
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Depending on the state of the cache this frees the given
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object or stores it in the cache.
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj)
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj;
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n))
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL)
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->cache == NULL)) {
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlXPathFreeObject(obj);
545960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache =
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathContextCachePtr) ctxt->cache;
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (obj->type) {
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_XSLT_TREE:
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->nodesetval != NULL) {
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (obj->boolval) {
546860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* It looks like the @boolval is used for
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* evaluation if this an XSLT Result Tree Fragment.
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* TODO: Check if this assumption is correct.
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			obj->type = XPATH_XSLT_TREE; /* just for debugging */
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathFreeValueTree(obj->nodesetval);
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			obj->nodesetval = NULL;
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((obj->nodesetval->nodeMax <= 40) &&
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(XP_CACHE_WANTS(cache->nodesetObjs,
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					cache->maxNodeset)))
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_CACHE_ADD(cache->nodesetObjs, obj);
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto obj_cached;
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathFreeNodeSet(obj->nodesetval);
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			obj->nodesetval = NULL;
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->stringval != NULL)
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(obj->stringval);
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) {
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_CACHE_ADD(cache->stringObjs, obj);
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto obj_cached;
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) {
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_CACHE_ADD(cache->booleanObjs, obj);
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto obj_cached;
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) {
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_CACHE_ADD(cache->numberObjs, obj);
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto obj_cached;
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_LOCATIONSET:
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->user != NULL) {
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPtrFreeLocationSet(obj->user);
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto free_obj;
551560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto free_obj;
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Fallback to adding to the misc-objects slot.
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) {
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_CACHE_ADD(cache->miscObjs, obj);
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto free_obj;
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectobj_cached:
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjUsageReleased(ctxt, obj->type);
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL) {
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodeSetPtr tmpset = obj->nodesetval;
553660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Due to those nasty ns-nodes, we need to traverse
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  the list and free the ns-nodes.
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * URGENT TODO: Check if it's actually slowing things down.
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Maybe we shouldn't try to preserve the list.
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpset->nodeNr > 1) {
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr node;
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < tmpset->nodeNr; i++) {
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node = tmpset->nodeTab[i];
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((node != NULL) &&
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(node->type == XML_NAMESPACE_DECL))
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathNodeSetFreeNs((xmlNsPtr) node);
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (tmpset->nodeNr == 1) {
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((tmpset->nodeTab[0] != NULL) &&
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL))
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]);
555960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpset->nodeNr = 0;
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(obj, 0, sizeof(xmlXPathObject));
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    obj->nodesetval = tmpset;
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(obj, 0, sizeof(xmlXPathObject));
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfree_obj:
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Cache is full; free the object.
557160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL)
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeNodeSet(obj->nodesetval);
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjUsageReleased(NULL, obj->type);
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj);
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Type Casting Routines				*
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToString:
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a boolean
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its string value.
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToString (int val) {
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val)
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "true");
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "false");
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToString:
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a number
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its string value.
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToString (double val) {
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (xmlXPathIsInf(val)) {
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 1:
5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "Infinity");
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case -1:
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "-Infinity");
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    default:
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(val)) {
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "NaN");
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (val == 0 && xmlXPathGetSign(val) != 0) {
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "0");
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* could be improved */
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char buf[100];
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFormatNumber(val, buf, 99);
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    buf[99] = 0;
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) buf);
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToString:
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its string value.
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToString (xmlNodePtr node) {
5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *ret;
5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret = xmlNodeGetContent(node)) == NULL)
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "");
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToString:
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a node-set
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its string value.
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToString (xmlNodeSetPtr ns) {
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL))
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlStrdup((const xmlChar *) ""));
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns->nodeNr > 1)
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetSort(ns);
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCastNodeToString(ns->nodeTab[0]));
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToString:
5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent
5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the allocated string value of the object, NULL in case of error.
568260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *         It's up to the caller to free the string memory with xmlFree().
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToString(xmlXPathObjectPtr val) {
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlStrdup((const xmlChar *) ""));
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_UNDEFINED:
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "String: undefined\n");
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "");
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCastNodeSetToString(val->nodesetval);
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlStrdup(val->stringval));
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCastBooleanToString(val->boolval);
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER: {
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCastNumberToString(val->floatval);
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "");
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertString:
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertString(xmlXPathObjectPtr val) {
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *res = NULL;
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewCString(""));
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n");
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNodeSetToString(val->nodesetval);
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastBooleanToString(val->boolval);
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNumberToString(val->floatval);
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(val);
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res == NULL)
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewCString(""));
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapString(res));
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToNumber:
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a boolean
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its number value
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToNumber(int val) {
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val)
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1.0);
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0.0);
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToNumber:
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a string
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its number value
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToNumber(const xmlChar * val) {
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathStringEvalNumber(val));
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToNumber:
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its number value
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToNumber (xmlNodePtr node) {
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *strval;
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    strval = xmlXPathCastNodeToString(node);
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (strval == NULL)
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCastStringToNumber(strval);
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(strval);
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToNumber:
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a node-set
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its number value
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) {
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str;
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns == NULL)
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = xmlXPathCastNodeSetToString(ns);
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCastStringToNumber(str);
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(str);
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToNumber:
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its number value
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToNumber(xmlXPathObjectPtr val) {
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret = 0.0;
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEGUB_EXPR
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n");
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathNAN;
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastNodeSetToNumber(val->nodesetval);
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastStringToNumber(val->stringval);
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = val->floatval;
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastBooleanToNumber(val->boolval);
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathNAN;
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertNumber:
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertNumber(xmlXPathObjectPtr val) {
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewFloat(0.0));
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_NUMBER)
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNewFloat(xmlXPathCastToNumber(val));
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(val);
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToBoolean:
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a number
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its boolean value
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToBoolean (double val) {
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     if (xmlXPathIsNaN(val) || (val == 0.0))
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return(0);
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     return(1);
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToBoolean:
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a string
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its boolean value
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToBoolean (const xmlChar *val) {
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val == NULL) || (xmlStrlen(val) == 0))
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToBoolean:
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a node-set
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its boolean value
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) {
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->nodeNr == 0))
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToBoolean:
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its boolean value
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToBoolean (xmlXPathObjectPtr val) {
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n");
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastNodeSetToBoolean(val->nodesetval);
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastStringToBoolean(val->stringval);
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastNumberToBoolean(val->floatval);
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = val->boolval;
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertBoolean:
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertBoolean(xmlXPathObjectPtr val) {
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewBoolean(0));
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_BOOLEAN)
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val));
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(val);
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Routines to handle XPath contexts			*
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewContext:
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the XML document
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathContext
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathContext just allocated. The caller will need to free it.
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextPtr
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewContext(xmlDocPtr doc) {
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextPtr ret;
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext));
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating context\n");
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathContext));
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = NULL;
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->varHash = NULL;
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nb_types = 0;
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->max_types = 0;
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->types = NULL;
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->funcHash = xmlHashCreate(0);
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nb_axis = 0;
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->max_axis = 0;
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->axis = NULL;
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nsHash = NULL;
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = NULL;
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->contextSize = -1;
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->proximityPosition = -1;
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEFAULT_CACHE_ON
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) {
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeContext(ret);
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
607360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathRegisterAllFunctions(ret);
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeContext:
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context to free
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathContext
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeContext(xmlXPathContextPtr ctxt) {
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->cache != NULL)
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisteredNsCleanup(ctxt);
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisteredFuncsCleanup(ctxt);
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisteredVariablesCleanup(ctxt);
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlResetError(&ctxt->lastError);
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Routines to handle XPath parser contexts		*
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT(ctxt)						\
610460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ctxt == NULL) {						\
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,				\
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, XML_FROM_XPATH,				\
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL,			\
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		__FILE__, __LINE__,					\
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL, 0, 0,					\
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"NULL context pointer\n");				\
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);							\
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }									\
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT_NEG(ctxt)						\
611560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ctxt == NULL) {						\
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,				\
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, XML_FROM_XPATH,				\
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL,			\
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		__FILE__, __LINE__,					\
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL, 0, 0,					\
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"NULL context pointer\n");				\
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);							\
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }									\
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CONTEXT(ctxt)						\
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->doc == NULL) ||			\
612860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        (ctxt->doc->children == NULL)) {				\
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT);	\
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);							\
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewParserContext:
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated.
6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParserContextPtr
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) {
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ret;
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext));
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(ctxt, "creating parser context\n");
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext));
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->cur = ret->base = str;
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = ctxt;
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->comp = xmlXPathNewCompExpr();
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->comp == NULL) {
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret->valueTab);
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->dict != NULL)) {
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->comp->dict = ctxt->dict;
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictReference(ret->comp->dict);
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompParserContext:
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the XPath compiled expression
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext when processing a compiled expression
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated.
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathParserContextPtr
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) {
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ret;
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext));
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(ctxt, "creating evaluation context\n");
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext));
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Allocate the value stack */
619160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->valueTab = (xmlXPathObjectPtr *)
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlMalloc(10 * sizeof(xmlXPathObjectPtr));
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->valueTab == NULL) {
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(ctxt, "creating evaluation context\n");
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->valueNr = 0;
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->valueMax = 10;
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->value = NULL;
6201df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret->valueFrame = 0;
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = ctxt;
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->comp = comp;
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeParserContext:
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context to free
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathParserContext
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) {
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueTab != NULL) {
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->valueTab);
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->comp != NULL) {
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->comp->stream != NULL) {
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreePatternList(ctxt->comp->stream);
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->comp->stream = NULL;
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeCompExpr(ctxt->comp);
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		The implicit core function library			*
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeValHash:
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node pointer
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node,
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash
6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeValHash(xmlNodePtr node) {
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 2;
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar * string = NULL;
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp = NULL;
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int ret = 0;
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->type == XML_DOCUMENT_NODE) {
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlDocGetRootElement((xmlDocPtr) node);
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL)
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->children;
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = tmp;
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node == NULL)
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node->type) {
6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    string = node->content;
6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string == NULL)
6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string[0] == 0)
6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(((unsigned int) string[0]) +
6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (((unsigned int) string[1]) << 8));
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    string = ((xmlNsPtr)node)->href;
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string == NULL)
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string[0] == 0)
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(((unsigned int) string[0]) +
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (((unsigned int) string[1]) << 8));
6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = ((xmlAttrPtr) node)->children;
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = node->children;
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (tmp != NULL) {
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (tmp->type) {
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_COMMENT_NODE:
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_PI_NODE:
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_CDATA_SECTION_NODE:
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_TEXT_NODE:
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		string = tmp->content;
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL:
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		string = ((xmlNsPtr)tmp)->href;
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((string != NULL) && (string[0] != 0)) {
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (len == 1) {
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret + (((unsigned int) string[0]) << 8));
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string[1] == 0) {
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len = 1;
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (unsigned int) string[0];
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(((unsigned int) string[0]) +
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       (((unsigned int) string[1]) << 8));
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Skip to next node
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) {
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp->children->type != XML_ENTITY_DECL) {
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = tmp->children;
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == node)
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp->next != NULL) {
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = tmp->next;
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
633960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = tmp->parent;
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL)
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == node) {
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = NULL;
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp->next != NULL) {
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = tmp->next;
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (tmp != NULL);
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringHash:
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string:  a string
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node,
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringHash(const xmlChar * string) {
6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string == NULL)
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((unsigned int) 0);
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string[0] == 0)
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(((unsigned int) string[0]) +
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (((unsigned int) string[1]) << 8));
6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetFloat:
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the node set
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the value
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a number
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns < @val    (1, 1, ...
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns <= @val   (1, 0, ...
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns > @val    (0, 1, ...
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns >= @val   (0, 0, ...
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number,
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in the
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set such that the result of performing the comparison on the number
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be compared and on the result of converting the string-value of that
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node to a number using the number function is true.
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict,
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    xmlXPathObjectPtr arg, xmlXPathObjectPtr f) {
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, ret = 0;
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns;
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str2;
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((f == NULL) || (arg == NULL) ||
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) {
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg);
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, f);
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ns->nodeNr;i++) {
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     str2 = xmlXPathCastNodeToString(ns->nodeTab[i]);
6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (str2 != NULL) {
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt,
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCacheNewString(ctxt->context, str2));
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlFree(str2);
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlXPathNumberFunction(ctxt, 1);
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f));
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ret = xmlXPathCompareValues(ctxt, inf, strict);
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 if (ret)
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     break;
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     }
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, f);
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetString:
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the node set
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @s:  the value
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a string
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns < @val    (1, 1, ...
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns <= @val   (1, 0, ...
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns > @val    (0, 1, ...
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns >= @val   (0, 0, ...
6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string,
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true.
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict,
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    xmlXPathObjectPtr arg, xmlXPathObjectPtr s) {
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, ret = 0;
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns;
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str2;
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((s == NULL) || (arg == NULL) ||
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) {
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg);
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, s);
6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ns->nodeNr;i++) {
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     str2 = xmlXPathCastNodeToString(ns->nodeTab[i]);
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (str2 != NULL) {
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt,
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCacheNewString(ctxt->context, str2));
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlFree(str2);
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s));
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ret = xmlXPathCompareValues(ctxt, inf, strict);
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 if (ret)
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     break;
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     }
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, s);
6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSets:
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first node set object
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second node set object
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation on nodesets:
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a node in the second node-set such that the result of performing
649860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * the comparison on the string-values of the two nodes is true.
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ....
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is <=, <, >= or >, then the objects are compared by converting both
6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * objects to numbers and comparing the numbers according to IEEE 754.
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ....
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The number function converts its argument to a number as follows:
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - a string that consists of optional whitespace followed by an
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    optional minus sign followed by a Number followed by whitespace
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    is converted to the IEEE 754 number that is nearest (according
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    to the IEEE 754 round-to-nearest rule) to the mathematical value
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    represented by the string; any other string is converted to NaN
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Conclusion all nodes need to be converted first to their string value
651260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * and then the comparison must be done when possible
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSets(int inf, int strict,
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) {
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, init = 0;
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val1;
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double *values2;
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns1;
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns2;
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) ||
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) {
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2 == NULL) ||
6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) {
6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns1 = arg1->nodesetval;
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns2 = arg2->nodesetval;
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns1 == NULL) || (ns1->nodeNr <= 0)) {
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns2 == NULL) || (ns2->nodeNr <= 0)) {
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double));
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (values2 == NULL) {
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ns1->nodeNr;i++) {
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]);
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(val1))
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0;j < ns2->nodeNr;j++) {
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (init == 0) {
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]);
6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathIsNaN(values2[j]))
6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
656760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (inf && strict)
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 < values2[j]);
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (inf && !strict)
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 <= values2[j]);
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (!inf && strict)
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 > values2[j]);
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (!inf && !strict)
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 >= values2[j]);
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret)
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret)
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	init = 1;
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(values2);
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(arg1);
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(arg2);
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetValue:
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the node set
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the value
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a value
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns < @val    (1, 1, ...
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns <= @val   (1, 0, ...
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns > @val    (0, 1, ...
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns >= @val   (0, 0, ...
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a boolean,
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if the result of performing
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison on the boolean and on the result of converting
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set to a boolean using the boolean function is true.
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict,
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    xmlXPathObjectPtr arg, xmlXPathObjectPtr val) {
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val == NULL) || (arg == NULL) ||
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch(val->type) {
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val));
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareNodeSets(inf, strict, arg, val));
6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val));
6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, arg);
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathBooleanFunction(ctxt, 1);
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, val);
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareValues(ctxt, inf, strict));
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetString:
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the nodeset object argument
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the string to compare to.
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq:  flag to show whether for '=' (0) or '!=' (1)
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string,
6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true.
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq)
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns;
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str2;
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int hash;
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((str == NULL) || (arg == NULL) ||
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * A NULL nodeset compared with a string is always false
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * (since there is no node equal, and no node not equal)
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->nodeNr <= 0) )
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hash = xmlXPathStringHash(str);
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ns->nodeNr; i++) {
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) {
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            str2 = xmlNodeGetContent(ns->nodeTab[i]);
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((str2 != NULL) && (xmlStrEqual(str, str2))) {
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(str2);
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (neq)
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) {
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (neq)
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (neq) {
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (str2 != NULL)
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(str2);
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (str2 != NULL)
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(str2);
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (neq)
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetFloat:
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the nodeset object argument
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the float to compare to
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq:  flag to show whether to compare '=' (0) or '!=' (1)
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number,
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number to be compared and on the result of converting the string-value
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of that node to a number using the number function is true.
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt,
6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg, double f, int neq) {
6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  int i, ret=0;
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlNodeSetPtr ns;
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlChar *str2;
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr val;
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  double v;
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg == NULL) ||
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i=0;i<ns->nodeNr;i++) {
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str2 = xmlXPathCastNodeToString(ns->nodeTab[i]);
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (str2 != NULL) {
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2));
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(str2);
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNumberFunction(ctxt, 1);
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val = valuePop(ctxt);
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v = val->floatval;
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, val);
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlXPathIsNaN(v)) {
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((!neq) && (v==f)) {
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((neq) && (v!=f)) {
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {	/* NaN is unequal to any value */
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (neq)
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSets:
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  first nodeset object argument
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  second nodeset object argument
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq:   flag to show whether to test '=' (0) or '!=' (1)
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal / not equal operation on XPath nodesets:
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 == @arg2  or  @arg1 != @arg2
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set and
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a node in the second node-set such that the result of performing the
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison on the string-values of the two nodes is true.
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (needless to say, this is a costly operation)
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) {
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int *hashs1;
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int *hashs2;
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar **values1;
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar **values2;
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns1;
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns2;
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) ||
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)))
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2 == NULL) ||
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE)))
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns1 = arg1->nodesetval;
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns2 = arg2->nodesetval;
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns1 == NULL) || (ns1->nodeNr <= 0))
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns2 == NULL) || (ns2->nodeNr <= 0))
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * for equal, check if there is a node pertaining to both sets
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (neq == 0)
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ns1->nodeNr;i++)
6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0;j < ns2->nodeNr;j++)
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ns1->nodeTab[i] == ns2->nodeTab[j])
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *));
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (values1 == NULL) {
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int));
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hashs1 == NULL) {
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values1);
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *));
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *));
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (values2 == NULL) {
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(hashs1);
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values1);
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int));
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hashs2 == NULL) {
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(hashs1);
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values1);
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values2);
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *));
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ns1->nodeNr;i++) {
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]);
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0;j < ns2->nodeNr;j++) {
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i == 0)
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]);
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (hashs1[i] != hashs2[j]) {
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (neq) {
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (values1[i] == NULL)
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    values1[i] = xmlNodeGetContent(ns1->nodeTab[i]);
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (values2[j] == NULL)
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    values2[j] = xmlNodeGetContent(ns2->nodeTab[j]);
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlStrEqual(values1[i], values2[j]) ^ neq;
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret)
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret)
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ns1->nodeNr;i++)
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (values1[i] != NULL)
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(values1[i]);
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (j = 0;j < ns2->nodeNr;j++)
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (values2[j] != NULL)
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(values2[j]);
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(values1);
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(values2);
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(hashs1);
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(hashs2);
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt,
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) {
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *At this point we are assured neither arg1 nor arg2
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *is a nodeset, so we can just pick the appropriate routine.
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (arg1->type) {
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_UNDEFINED:
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Equal: undefined\n");
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (arg2->type) {
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        case XPATH_UNDEFINED:
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: undefined\n");
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: %d boolean %d \n",
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    arg1->boolval, arg2->boolval);
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg1->boolval == arg2->boolval);
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg1->boolval ==
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCastNumberToBoolean(arg2->floatval));
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((arg2->stringval == NULL) ||
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(arg2->stringval[0] == 0)) ret = 0;
690760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    else
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg1->boolval == ret);
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (arg2->type) {
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        case XPATH_UNDEFINED:
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: undefined\n");
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg2->boolval==
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCastNumberToBoolean(arg1->floatval));
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt, arg2);
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNumberFunction(ctxt, 1);
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    arg2 = valuePop(ctxt);
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* no break on purpose */
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Hand check NaN and Infinity equalities */
6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlXPathIsNaN(arg1->floatval) ||
694260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    xmlXPathIsNaN(arg2->floatval)) {
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = 0;
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == 1) {
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (xmlXPathIsInf(arg2->floatval) == 1)
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == -1) {
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg2->floatval) == -1)
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == 1) {
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == 1)
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == -1) {
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == -1)
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = (arg1->floatval == arg2->floatval);
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (arg2->type) {
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        case XPATH_UNDEFINED:
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: undefined\n");
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((arg1->stringval == NULL) ||
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(arg1->stringval[0] == 0)) ret = 0;
699060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    else
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg2->boolval == ret);
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStrEqual(arg1->stringval, arg2->stringval);
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt, arg1);
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNumberFunction(ctxt, 1);
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    arg1 = valuePop(ctxt);
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Hand check NaN and Infinity equalities */
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlXPathIsNaN(arg1->floatval) ||
700360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    xmlXPathIsNaN(arg2->floatval)) {
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = 0;
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == 1) {
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg2->floatval) == 1)
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == -1) {
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg2->floatval) == -1)
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == 1) {
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == 1)
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == -1) {
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == -1)
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = (arg1->floatval == arg2->floatval);
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_USERS:
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg1);
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg2);
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualValues:
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValues(xmlXPathParserContextPtr ctxt) {
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2, argtmp;
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(0);
706960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    arg2 = valuePop(ctxt);
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = valuePop(ctxt);
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) || (arg2 == NULL)) {
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (arg1 != NULL)
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg1);
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1 == arg2) {
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Equal: by pointer\n");
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(1);
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *If either argument is a nodeset, it's a 'special case'
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) ||
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *Hack it to assure arg1 is the nodeset
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) {
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argtmp = arg2;
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg2 = arg1;
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg1 = argtmp;
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (arg2->type) {
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_UNDEFINED:
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Equal: undefined\n");
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_XSLT_TREE:
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSets(arg1, arg2, 0);
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((arg1->nodesetval == NULL) ||
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (arg1->nodesetval->nodeNr == 0)) ret = 0;
711560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		else
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (ret == arg2->boolval);
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0);
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0);
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_USERS:
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_POINT:
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_RANGE:
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_LOCATIONSET:
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg2);
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2));
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotEqualValues:
7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) {
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2, argtmp;
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(0);
715460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    arg2 = valuePop(ctxt);
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = valuePop(ctxt);
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) || (arg2 == NULL)) {
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (arg1 != NULL)
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg1);
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1 == arg2) {
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"NotEqual: by pointer\n");
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *If either argument is a nodeset, it's a 'special case'
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) ||
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *Hack it to assure arg1 is the nodeset
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) {
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argtmp = arg2;
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg2 = arg1;
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg1 = argtmp;
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (arg2->type) {
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_UNDEFINED:
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"NotEqual: undefined\n");
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_XSLT_TREE:
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSets(arg1, arg2, 1);
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((arg1->nodesetval == NULL) ||
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (arg1->nodesetval->nodeNr == 0)) ret = 0;
720060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		else
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (ret != arg2->boolval);
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1);
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1);
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_USERS:
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_POINT:
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_RANGE:
7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_LOCATIONSET:
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg2);
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2));
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareValues:
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
723160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Implement the compare operation on XPath objects:
7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 < @arg2    (1, 1, ...
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 <= @arg2   (1, 0, ...
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 > @arg2    (0, 1, ...
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 >= @arg2   (0, 0, ...
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator is
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <=, <, >=, >, then the objects are compared by converted both objects
7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to numbers and comparing the numbers according to IEEE 754. The <
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison will be true if and only if the first number is less than the
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * second number. The <= comparison will be true if and only if the first
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number is less than or equal to the second number. The > comparison
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if the first number is greater than the second
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number. The >= comparison will be true if and only if the first number
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is greater than or equal to the second number.
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison succeeded, 0 if it failed
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) {
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, arg1i = 0, arg2i = 0;
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(0);
725560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    arg2 = valuePop(ctxt);
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = valuePop(ctxt);
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) || (arg2 == NULL)) {
7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (arg1 != NULL)
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg1);
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) ||
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * are not freed from within this routine; they will be freed from the
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) &&
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2);
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict,
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                          arg1, arg2);
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict,
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                          arg2, arg1);
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1->type != XPATH_NUMBER) {
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, arg1);
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNumberFunction(ctxt, 1);
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg1 = valuePop(ctxt);
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1->type != XPATH_NUMBER) {
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2->type != XPATH_NUMBER) {
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, arg2);
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNumberFunction(ctxt, 1);
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg2 = valuePop(ctxt);
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2->type != XPATH_NUMBER) {
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg2);
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Add tests for infinity and nan
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * => feedback on 3.4 for Inf and NaN
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Hand check NaN and Infinity comparisons */
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) {
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret=0;
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg1i=xmlXPathIsInf(arg1->floatval);
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg2i=xmlXPathIsInf(arg2->floatval);
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (inf && strict) {
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1i == -1 && arg2i != -1) ||
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(arg2i == 1 && arg1i != 1)) {
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval < arg2->floatval);
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (inf && !strict) {
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (arg1i == -1 || arg2i == 1) {
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval <= arg2->floatval);
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (!inf && strict) {
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1i == 1 && arg2i != 1) ||
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(arg2i == -1 && arg1i != -1)) {
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval > arg2->floatval);
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (!inf && !strict) {
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (arg1i == 1 || arg2i == -1) {
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval >= arg2->floatval);
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg1);
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg2);
7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathValueFlipSign:
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the unary - operation on an XPath object
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) {
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return;
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(ctxt->value->floatval))
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval=xmlXPathNAN;
7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlXPathIsInf(ctxt->value->floatval) == 1)
7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval=xmlXPathNINF;
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlXPathIsInf(ctxt->value->floatval) == -1)
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval=xmlXPathPINF;
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (ctxt->value->floatval == 0) {
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlXPathGetSign(ctxt->value->floatval) == 0)
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNZERO;
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = 0;
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval = - ctxt->value->floatval;
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathAddValues:
7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the add operation on XPath objects:
7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathAddValues(xmlXPathParserContextPtr ctxt) {
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval += val;
7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubValues:
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the subtraction operation on XPath objects:
7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubValues(xmlXPathParserContextPtr ctxt) {
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval -= val;
7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathMultValues:
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the multiply operation on XPath objects:
7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathMultValues(xmlXPathParserContextPtr ctxt) {
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval *= val;
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDivValues:
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the div operation on XPath objects @arg1 / @arg2:
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDivValues(xmlXPathParserContextPtr ctxt) {
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval))
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval = xmlXPathNAN;
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (val == 0 && xmlXPathGetSign(val) != 0) {
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval == 0)
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNAN;
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval > 0)
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNINF;
7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval < 0)
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathPINF;
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (val == 0) {
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval == 0)
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNAN;
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval > 0)
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathPINF;
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval < 0)
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNINF;
749660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval /= val;
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathModValues:
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the mod operation on XPath objects: @arg1 / @arg2
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathModValues(xmlXPathParserContextPtr ctxt) {
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double arg1, arg2;
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg2 = xmlXPathCastToNumber(arg);
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = ctxt->value->floatval;
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2 == 0)
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval = xmlXPathNAN;
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval = fmod(arg1, arg2);
7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		The traversal functions					*
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis.
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL.
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunction)
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlXPathParserContextPtr ctxt, xmlNodePtr cur);
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTraversalFunctionExt:
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis.
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL.
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The context node of the traversal is specified via @contextNode.
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunctionExt)
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlNodePtr cur, xmlNodePtr contextNode);
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeFunction:
7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used for merging node sets in xmlXPathCollectAndTest().
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction)
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlNodeSetPtr, xmlNodeSetPtr, int);
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextSelf:
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "self" direction
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The self axis contains just the context node itself
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node);
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChild:
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order.
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) return(NULL);
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (ctxt->context->node->type) {
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DTD_NODE:
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->context->node->children);
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(((xmlDocPtr) ctxt->context->node)->children);
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_DECL:
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ATTRIBUTE_DECL:
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_DECL:
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE:
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL:
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_END:
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type == XML_DOCUMENT_NODE) ||
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (cur->type == XML_HTML_DOCUMENT_NODE))
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur->next);
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChildElement:
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction and nodes of type element.
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order.
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = ctxt->context->node;
7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL) return(NULL);
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the first element child.
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->type) {
7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCUMENT_FRAG_NODE:
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->children;
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur != NULL) {
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->type == XML_ELEMENT_NODE)
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(cur);
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->next;
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while ((cur != NULL) &&
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(cur->type != XML_ELEMENT_NODE));
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(cur);
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlDocGetRootElement((xmlDocPtr) cur));
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Get the next sibling element node.
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (cur->type) {
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_REF_NODE:
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_NODE:
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_XINCLUDE_END:
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) {
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->next->type == XML_ELEMENT_NODE)
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur->next);
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE));
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(cur);
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelfElemParent:
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" axis.
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Additionally it returns only nodes which can be parents of
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element nodes.
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur,
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlNodePtr contextNode)
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextNode == NULL)
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (contextNode->type) {
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_NODE:
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCUMENT_FRAG_NODE:
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCUMENT_NODE:
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
773160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_HTML_DOCUMENT_NODE:
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(contextNode);
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
773460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return(NULL);
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr start = cur;
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (cur->type) {
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ELEMENT_NODE:
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: OK to have XInclude here? */
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_XINCLUDE_START:
774560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		case XML_DOCUMENT_FRAG_NODE:
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur != start)
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(cur);
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->children != NULL) {
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->children;
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue;
7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Not sure if we need those here. */
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DOCUMENT_NODE:
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DOCB_DOCUMENT_NODE:
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_HTML_DOCUMENT_NODE:
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur != start)
7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(cur);
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(xmlDocGetRootElement((xmlDocPtr) cur));
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
776460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
776560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sibling:
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur == NULL) || (cur == contextNode))
776860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return(NULL);
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->next != NULL) {
777060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		cur = cur->next;
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->parent;
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_sibling;
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
777860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott}
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendant:
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant" direction
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant axis contains the descendants of the context node in document
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order; a descendant is a child or a child of a child and so on.
7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL)
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->context->node->type == XML_NAMESPACE_DECL))
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->context->doc->children);
7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node->children);
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->children != NULL) {
7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Do not descend on entities declarations
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
781060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (cur->children->type != XML_ENTITY_DECL) {
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->children;
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Skip DTDs
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->type != XML_DTD_NODE)
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == ctxt->context->node) return(NULL);
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->next != NULL) {
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type != XML_ENTITY_DECL) &&
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type != XML_DTD_NODE))
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur);
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
782860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL) break;
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == ctxt->context->node) return(NULL);
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->next != NULL) {
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur);
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (cur != NULL);
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelf:
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" direction
7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant-or-self axis contains the context node and the descendants
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node in document order; thus the context node is the first
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis, and the first child of the context node is the second node
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the axis
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL)
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->context->node->type == XML_NAMESPACE_DECL))
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node);
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNextDescendant(ctxt, cur));
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextParent:
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "parent" direction
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parent axis contains the parent of the context node, if there is one.
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the parent of an attribute or namespace node is the element
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * to which the attribute or namespace node is attached
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Namespace handling !!!
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) return(NULL);
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (ctxt->context->node->type) {
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DTD_NODE:
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_DECL:
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ATTRIBUTE_DECL:
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_END:
7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_DECL:
7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->context->node->parent == NULL)
7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ctxt->context->doc);
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((ctxt->context->node->parent->name[0] == ' ') ||
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (xmlStrEqual(ctxt->context->node->parent->name,
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 BAD_CAST "fake node libxslt"))))
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->context->node->parent);
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE: {
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(att->parent);
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL: {
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
792760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ns->next != NULL) &&
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (ns->next->type != XML_NAMESPACE_DECL))
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ns->next);
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestor:
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor" direction
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the ancestor axis contains the ancestors of the context node; the ancestors
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node consist of the parent of context node and the parent's
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent and so on; the nodes are ordered in reverse document order; thus the
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent is the first node on the axis, and the parent's parent is the second
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the parent of an attribute or namespace node is the element
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * to which the attribute or namespace node is attached
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * !!!!!!!!!!!!!
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) return(NULL);
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (ctxt->context->node->type) {
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DTD_NODE:
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_DECL:
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ATTRIBUTE_DECL:
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_DECL:
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_END:
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->context->node->parent == NULL)
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ctxt->context->doc);
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((ctxt->context->node->parent->name[0] == ' ') ||
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (xmlStrEqual(ctxt->context->node->parent->name,
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 BAD_CAST "fake node libxslt"))))
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->context->node->parent);
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE: {
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node;
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(tmp->parent);
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL: {
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
800060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ns->next != NULL) &&
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (ns->next->type != XML_NAMESPACE_DECL))
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ns->next);
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Bad, how did that namespace end up here ? */
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == ctxt->context->doc->children)
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((xmlNodePtr) ctxt->context->doc);
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == (xmlNodePtr) ctxt->context->doc)
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (cur->type) {
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_REF_NODE:
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_NODE:
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NOTATION_NODE:
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DTD_NODE:
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ELEMENT_DECL:
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ATTRIBUTE_DECL:
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ENTITY_DECL:
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_XINCLUDE_START:
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_XINCLUDE_END:
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->parent == NULL)
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->parent->type == XML_ELEMENT_NODE) &&
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->parent->name[0] == ' ') ||
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (xmlStrEqual(cur->parent->name,
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      BAD_CAST "fake node libxslt"))))
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur->parent);
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE: {
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(att->parent);
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL: {
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
804460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ns->next != NULL) &&
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (ns->next->type != XML_NAMESPACE_DECL))
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return((xmlNodePtr) ns->next);
8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Bad, how did that namespace end up here ? */
8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(NULL);
8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCUMENT_NODE:
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCUMENT_TYPE_NODE:
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCUMENT_FRAG_NODE:
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_HTML_DOCUMENT_NODE:
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCB_DOCUMENT_NODE:
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestorOrSelf:
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor-or-self" direction
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * he ancestor-or-self axis contains the context node and ancestors of
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node in reverse document order; thus the context node is
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node on the axis, and the context node's parent the second;
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent here is defined the same as with the parent axis.
8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node);
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNextAncestor(ctxt, cur));
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowingSibling:
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following-sibling" direction
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following-sibling axis contains the following siblings of the context
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in document order.
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->context->node->type == XML_NAMESPACE_DECL))
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == (xmlNodePtr) ctxt->context->doc)
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node->next);
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur->next);
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingSibling:
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding-sibling" direction
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The preceding-sibling axis contains the preceding siblings of the context
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in reverse document order; the first preceding sibling is first on the
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * axis; the sibling preceding that node is the second on the axis and so on.
8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->context->node->type == XML_NAMESPACE_DECL))
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == (xmlNodePtr) ctxt->context->doc)
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node->prev);
8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) {
8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->prev;
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL)
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->context->node->prev);
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur->prev);
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowing:
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following" direction
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following axis contains all nodes in the same document as the context
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are after the context node in document order, excluding any
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * descendants and excluding attribute nodes and namespace nodes; the nodes
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are ordered in document order
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8154df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((cur != NULL) && (cur->type  != XML_ATTRIBUTE_NODE) &&
8155df143a5041f03a22808b59c76698770b74692815Selim Gurun        (cur->type != XML_NAMESPACE_DECL) && (cur->children != NULL))
8156df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(cur->children);
8157df143a5041f03a22808b59c76698770b74692815Selim Gurun
8158df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (cur == NULL) {
8159df143a5041f03a22808b59c76698770b74692815Selim Gurun        cur = ctxt->context->node;
8160df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (cur->type == XML_NAMESPACE_DECL)
8161df143a5041f03a22808b59c76698770b74692815Selim Gurun            return(NULL);
8162df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (cur->type == XML_ATTRIBUTE_NODE)
8163df143a5041f03a22808b59c76698770b74692815Selim Gurun            cur = cur->parent;
8164df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return(NULL) ; /* ERROR */
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) return(cur->next) ;
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL) break;
8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL);
8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) return(cur->next);
8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (cur != NULL);
8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAncestor:
8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ancestor:  the ancestor node
8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the current node
8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that @ancestor is a @node's ancestor
8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if @ancestor is a @node's ancestor, 0 otherwise.
8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) {
8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ancestor == NULL) || (node == NULL)) return(0);
8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* nodes need to be in the same document */
8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ancestor->doc != node->doc) return(0);
8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* avoid searching if ancestor or node is the root node */
8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ancestor == (xmlNodePtr) node->doc) return(1);
8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == (xmlNodePtr) ancestor->doc) return(0);
8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node->parent != NULL) {
8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->parent == ancestor)
8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(1);
8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = node->parent;
8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPreceding:
8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction
8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context
8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any
8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are
8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order
8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur)
8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8218df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (cur == NULL) {
8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = ctxt->context->node;
8220df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (cur->type == XML_NAMESPACE_DECL)
8221df143a5041f03a22808b59c76698770b74692815Selim Gurun            return(NULL);
8222df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (cur->type == XML_ATTRIBUTE_NODE)
8223df143a5041f03a22808b59c76698770b74692815Selim Gurun            return(cur->parent);
8224df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE))
8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->prev;
8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->prev != NULL) {
8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (cur = cur->prev; cur->last != NULL; cur = cur->last) ;
8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (cur);
8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == ctxt->context->doc->children)
8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (xmlXPathIsAncestor(cur, ctxt->context->node));
8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (cur);
8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingInternal:
8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction
8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context
8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any
8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are
8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order
825460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * This is a faster implementation but internal only since it requires a
8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state kept in the parser context: ctxt->ancestor.
8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt,
8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr cur)
8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = ctxt->context->node;
8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8268df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (cur->type == XML_NAMESPACE_DECL)
8269df143a5041f03a22808b59c76698770b74692815Selim Gurun            return (NULL);
8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->ancestor = cur->parent;
8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE))
8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->prev;
8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->prev == NULL) {
8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == ctxt->context->doc->children)
8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != ctxt->ancestor)
8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (cur);
8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->ancestor = cur->parent;
8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->prev;
8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->last != NULL)
8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->last;
8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (cur);
8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextNamespace:
8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current attribute in the traversal
8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "namespace" direction
8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace axis contains the namespace nodes of the context node;
8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the order of nodes on this axis is implementation-defined; the axis will
8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be empty unless the context node is an element
8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We keep the XML namespace node at the end of the list.
8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL);
8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) {
8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->context->tmpNsList != NULL)
8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ctxt->context->tmpNsList);
831160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ctxt->context->tmpNsList =
8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGetNsList(ctxt->context->doc, ctxt->context->node);
8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->tmpNsNr = 0;
8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->tmpNsList != NULL) {
8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) {
8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->tmpNsNr++;
8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((xmlNodePtr) xmlXPathXMLNamespace);
8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->tmpNsNr > 0) {
8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr];
8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->tmpNsList != NULL)
8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ctxt->context->tmpNsList);
8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->tmpNsList = NULL;
8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAttribute:
8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current attribute in the traversal
8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "attribute" direction
8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: support DTD inherited default attributes
8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->node == NULL)
8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->node->type != XML_ELEMENT_NODE)
8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return((xmlNodePtr)ctxt->context->node->properties);
8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlNodePtr)cur->next);
8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		NodeTest Functions					*
8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_FUNCTION			200
8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Implicit tree core function library			*
8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoot:
8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the context to the root of the document
8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoot(xmlXPathParserContextPtr ctxt) {
8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL))
8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = (xmlNodePtr) ctxt->context->doc;
8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node));
8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		The explicit core function library			*
8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib	*
8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLastFunction:
8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the last() XPath function
8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number last()
8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The last function returns the number of nodes in the context node list.
8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->contextSize >= 0) {
8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt,
8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCacheNewFloat(ctxt->context,
8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(double) ctxt->context->contextSize));
8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"last() : %d\n", ctxt->context->contextSize);
8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_CTXT_SIZE);
8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPositionFunction:
8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the position() XPath function
8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number position()
8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The position function returns the position of the context node in the
8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node list. The first position is 1, and so the last position
8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be equal to last().
8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->proximityPosition >= 0) {
8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt,
8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      xmlXPathCacheNewFloat(ctxt->context,
8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(double) ctxt->context->proximityPosition));
8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "position() : %d\n",
8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->proximityPosition);
8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_CTXT_POSITION);
8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCountFunction:
8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the count() XPath function
8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number count(node-set)
8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
845960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((ctxt->value == NULL) ||
8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (cur->nodesetval == NULL))
8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0));
8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) {
8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (double) cur->nodesetval->nodeNr));
8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->nodesetval->nodeNr != 1) ||
8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->nodesetval->nodeTab == NULL)) {
8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0));
8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr tmp;
8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i = 0;
8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = cur->nodesetval->nodeTab[0];
8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != NULL) {
8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = tmp->children;
8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (tmp != NULL) {
8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = tmp->next;
8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i));
8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetElementsByIds:
8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ids:  a whitespace separated list of IDs
8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Selects elements by their unique ID.
8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node-set of selected elements.
8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) {
8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = ids;
8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ID;
8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr elem = NULL;
8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ids == NULL) return(NULL);
8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
851260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
851360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(ret);
8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) cur++;
8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur != 0) {
8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((!IS_BLANK_CH(*cur)) && (*cur != 0))
8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ID = xmlStrndup(ids, cur - ids);
8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ID != NULL) {
8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * We used to check the fact that the value passed
8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * was an NCName, but this generated much troubles for
8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * me and Aleksey Sanin, people blatantly violated that
8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * constaint, like Visa3D spec.
8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * if (xmlValidateNCName(ID, 1) == 0)
8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlGetID(doc, ID);
8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr != NULL) {
8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (attr->type == XML_ATTRIBUTE_NODE)
8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem = attr->parent;
8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (attr->type == XML_ELEMENT_NODE)
8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem = (xmlNodePtr) attr;
8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem = NULL;
8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (elem != NULL)
8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetAdd(ret, elem);
8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ID);
8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_BLANK_CH(*cur)) cur++;
8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ids = cur;
8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIdFunction:
8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the id() XPath function
8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set id(object)
8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The id function selects elements by their unique ID
8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set,
8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the result is the union of the result of applying id to the
8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string value of each of the nodes in the argument node-set. When the
8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument to id is of any other type, the argument is converted to a
8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string as if by a call to the string function; the string is split
8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into a whitespace-separated list of tokens (whitespace is any sequence
8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of characters matching the production S); the result is a node-set
8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * containing the elements in the same document as the context node that
8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have a unique ID equal to any of the tokens in the list.
8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *tokens;
8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) {
8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodeSetPtr ns;
8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathNodeSetCreate(NULL);
858160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        /*
858260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott         * FIXME -- in an out-of-memory condition this will behave badly.
858360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott         * The solution is not clear -- we already popped an item from
858460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott         * ctxt, so the object is in a corrupt state.
858560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott         */
8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL) {
8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < obj->nodesetval->nodeNr; i++) {
8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tokens =
8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]);
8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens);
8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathNodeSetMerge(ret, ns);
8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeNodeSet(ns);
8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tokens != NULL)
8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(tokens);
8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, obj);
8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret));
8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = xmlXPathCacheConvertString(ctxt->context, obj);
8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval);
860460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret));
8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLocalNameFunction:
8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the local-name() XPath function
8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string local-name(node-set?)
8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The local-name function returns a string containing the local part
8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the name of the node in the argument node-set that is first in
8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document order. If the node-set is empty or the first node has no
8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * name, an empty string is returned. If the argument is omitted it
8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node.
8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node));
8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nargs = 1;
8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
863560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((ctxt->value == NULL) ||
8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) {
8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i = 0; /* Should be first in document order !!!!! */
8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->nodesetval->nodeTab[i]->type) {
8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodesetval->nodeTab[i]->name[0] == ' ')
8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt,
8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlXPathCacheNewString(ctxt->context,
8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur->nodesetval->nodeTab[i]->name));
8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix));
8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNamespaceURIFunction:
8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the namespace-uri() XPath function
8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string namespace-uri(node-set?)
8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The namespace-uri function returns a string containing the
8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace URI of the expanded name of the node in the argument
8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set that is first in document order. If the node-set is empty,
8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node has no name, or the expanded name has no namespace
8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URI, an empty string is returned. If the argument is omitted it
8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node.
8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node));
8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nargs = 1;
8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
869360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((ctxt->value == NULL) ||
8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) {
8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i = 0; /* Should be first in document order !!!!! */
8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->nodesetval->nodeTab[i]->type) {
8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodesetval->nodeTab[i]->ns == NULL)
8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  cur->nodesetval->nodeTab[i]->ns->href));
8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNameFunction:
8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the name() XPath function
8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string name(node-set?)
8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The name function returns a string containing a QName representing
8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the name of the node in the argument node-set that is first in document
8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order. The QName must represent the name with respect to the namespace
8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declarations in effect on the node whose name is being represented.
8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Typically, this will be the form in which the name occurred in the XML
8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * source. This need not be the case if there are namespace declarations
8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in effect on the node that associate multiple prefixes with the same
8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace. However, an implementation may include information about
8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the original prefix in its representation of nodes; in this case, an
8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation can ensure that the returned string is always the same
8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as the QName used in the XML source. If the argument it omitted it
8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node.
8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Libxml keep the original prefix so the "real qualified name" used is
8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned.
8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs)
8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node));
8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nargs = 1;
8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((ctxt->value->type != XPATH_NODESET) &&
8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (ctxt->value->type != XPATH_XSLT_TREE)))
8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE);
8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) {
8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i = 0;              /* Should be first in document order !!!!! */
8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (cur->nodesetval->nodeTab[i]->type) {
8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE:
8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->nodesetval->nodeTab[i]->name[0] == ' ')
8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt,
8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathCacheNewCString(ctxt->context, ""));
8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if ((cur->nodesetval->nodeTab[i]->ns == NULL) ||
8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) {
8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt,
8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlXPathCacheNewString(ctxt->context,
8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur->nodesetval->nodeTab[i]->name));
8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *fullname;
877760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name,
8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     cur->nodesetval->nodeTab[i]->ns->prefix,
8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     NULL, 0);
8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (fullname == cur->nodesetval->nodeTab[i]->name)
8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name);
8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (fullname == NULL) {
8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_ERROR(XPATH_MEMORY_ERROR);
8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt, xmlXPathCacheWrapString(
8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->context, fullname));
8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            default:
8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->nodesetval->nodeTab[i]));
8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathLocalNameFunction(ctxt, 1);
8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringFunction:
8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string() XPath function
8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string string(object?)
8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string function converts an object to a string as follows:
8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - A node-set is converted to a string by returning the value of
8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      the node in the node-set that is first in document order.
8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      If the node-set is empty, an empty string is returned.
8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - A number is converted to a string as follows
881260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *      + NaN is converted to the string NaN
881360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *      + positive zero is converted to the string 0
881460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *      + negative zero is converted to the string 0
881560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *      + positive infinity is converted to the string Infinity
881660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *      + negative infinity is converted to the string -Infinity
8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + if the number is an integer, the number is represented in
8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        decimal form as a Number with no decimal point and no leading
8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        zeros, preceded by a minus sign (-) if the number is negative
8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + otherwise, the number is represented in decimal form as a
8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        Number including a decimal point with at least one digit
8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        before the decimal point and at least one digit after the
8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        decimal point, preceded by a minus sign (-) if the number
8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        is negative; there must be no leading zeros before the decimal
8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        point apart possibly from the one required digit immediately
8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        before the decimal point; beyond the one required digit
8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        after the decimal point there must be as many, but only as
8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        many, more digits as are needed to uniquely distinguish the
8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        number from all other IEEE 754 numeric values.
8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - The boolean false value is converted to the string false.
8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      The boolean true value is converted to the string true.
8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the argument is omitted, it defaults to a node-set with the
8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node as its only member.
8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt,
8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheWrapString(ctxt->context,
8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCastNodeToString(ctxt->context->node)));
8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur));
8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringLengthFunction:
8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string-length() XPath function
8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number string-length(string?)
8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string-length returns the number of characters in the string
8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [3.6 Strings]). If the argument is omitted, it defaults to
8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node converted to a string, in other words the value
8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node.
8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt == NULL) || (ctxt->context == NULL))
8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) {
8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0));
8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *content;
8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content = xmlXPathCastNodeToString(ctxt->context->node);
8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlUTF8Strlen(content)));
8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(content);
8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
889060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlUTF8Strlen(cur->stringval)));
8891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConcatFunction:
8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the concat() XPath function
8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string concat(string, string, string*)
8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The concat function returns the concatenation of its arguments.
8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur, newobj;
8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *tmp;
8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs < 2) {
8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ARITY(2);
8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (cur->type != XPATH_STRING)) {
8916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, cur);
8917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nargs--;
8920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (nargs > 0) {
8922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CAST_TO_STRING;
8923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newobj = valuePop(ctxt);
8924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((newobj == NULL) || (newobj->type != XPATH_STRING)) {
8925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, newobj);
8926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, cur);
8927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_INVALID_TYPE);
8928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlStrcat(newobj->stringval, cur->stringval);
8930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newobj->stringval = cur->stringval;
8931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->stringval = tmp;
8932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, newobj);
8933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nargs--;
8934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, cur);
8936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContainsFunction:
8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the contains() XPath function
8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean contains(string, string)
8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contains function returns true if the first argument string
8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * contains the second argument string, and otherwise returns false.
8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr hay, needle;
8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(2);
8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    needle = valuePop(ctxt);
8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hay = valuePop(ctxt);
8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((hay == NULL) || (hay->type != XPATH_STRING)) {
8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, hay);
8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, needle);
8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrstr(hay->stringval, needle->stringval))
8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, hay);
8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, needle);
8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStartsWithFunction:
8974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the starts-with() XPath function
8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean starts-with(string, string)
8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The starts-with function returns true if the first argument string
8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starts with the second argument string, and otherwise returns false.
8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr hay, needle;
8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int n;
8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(2);
8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    needle = valuePop(ctxt);
8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hay = valuePop(ctxt);
8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((hay == NULL) || (hay->type != XPATH_STRING)) {
8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, hay);
8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, needle);
8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    n = xmlStrlen(needle->stringval);
9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrncmp(hay->stringval, needle->stringval, n))
9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, hay);
9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, needle);
9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringFunction:
9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring() XPath function
9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string substring(string, number, number?)
9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring function returns the substring of the first argument
9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starting at the position specified in the second argument with
9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * length specified in the third argument. For example,
9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substring("12345",2,3) returns "234". If the third argument is not
9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specified, it returns the substring starting at the position specified
9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the second argument and continuing to the end of the string. For
9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * example, substring("12345",2) returns "2345".  More precisely, each
9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string (see [3.6 Strings]) is considered to have a
9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * numeric position: the position of the first character is 1, the position
9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the second character is 2 and so on. The returned substring contains
9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * those characters for which the position of the character is greater than
9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or equal to the second argument and, if the third argument is specified,
9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * less than the sum of the second and third arguments; the comparisons
9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and addition used for the above follow the standard IEEE 754 rules. Thus:
902960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  - substring("12345", 1.5, 2.6) returns "234"
903060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  - substring("12345", 0, 3) returns "12"
903160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  - substring("12345", 0 div 0, 3) returns ""
903260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  - substring("12345", 1, 0 div 0) returns ""
903360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  - substring("12345", -42, 1 div 0) returns "12345"
903460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  - substring("12345", -1 div 0, 1 div 0) returns ""
9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr str, start, len;
9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double le=0, in;
9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l, m;
9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs < 2) {
9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ARITY(2);
9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs > 3) {
9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ARITY(3);
9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * take care of possible last (position) argument
9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 3) {
9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CAST_TO_NUMBER;
9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_TYPE(XPATH_NUMBER);
9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = valuePop(ctxt);
9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	le = len->floatval;
9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, len);
9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = valuePop(ctxt);
9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    in = start->floatval;
9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, start);
9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = valuePop(ctxt);
9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    m = xmlUTF8Strlen((const unsigned char *)str->stringval);
9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If last pos not present, calculate last position
9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs != 3) {
9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	le = (double)m;
907560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (in < 1.0)
9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in = 1.0;
9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
907960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Need to check for the special cases where either
9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the index is NaN, the length is NaN, or both
9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * arguments are infinity (relying on Inf + -Inf = NaN)
9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9083df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (!xmlXPathIsInf(in) && !xmlXPathIsNaN(in + le)) {
9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * To meet the requirements of the spec, the arguments
908660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * must be converted to integer format before
9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * initial index calculations are done
9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         *
9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * First we go to integer form, rounding up
9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * and checking for special cases
9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i = (int) in;
9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (((double)i)+0.5 <= in) i++;
9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsInf(le) == 1) {
9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    l = m;
9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i < 1)
9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i = 1;
9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlXPathIsInf(le) == -1 || le < 0.0)
9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    l = 0;
9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    l = (int) le;
9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((double)l)+0.5 <= le) l++;
9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Now we normalize inidices */
9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i -= 1;
9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        l += i;
9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (i < 0)
9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            i = 0;
9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (l > m)
9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            l = m;
9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* number of chars to copy */
9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        l -= i;
9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlUTF8Strsub(str->stringval, i, l);
9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = NULL;
9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret));
9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, str);
9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringBeforeFunction:
9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-before() XPath function
9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string substring-before(string, string)
9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-before function returns the substring of the first
9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that precedes the first occurrence of the second
9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty string
9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument
9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-before("1999/04/01","/") returns 1999.
9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr str;
9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr find;
9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlBufferPtr target;
9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  const xmlChar *point;
9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  int offset;
915260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_ARITY(2);
9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  find = valuePop(ctxt);
9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  str = valuePop(ctxt);
915860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  target = xmlBufferCreate();
9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (target) {
9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    point = xmlStrstr(str->stringval, find->stringval);
9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (point) {
9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      offset = (int)(point - str->stringval);
9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlBufferAdd(target, str->stringval, offset);
9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, str);
9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, find);
9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringAfterFunction:
9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-after() XPath function
9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string substring-after(string, string)
9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-after function returns the substring of the first
9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that follows the first occurrence of the second
9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty stringi
9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument
9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-after("1999/04/01","/") returns 04/01,
9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and substring-after("1999/04/01","19") returns 99/04/01.
9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr str;
9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr find;
9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlBufferPtr target;
9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  const xmlChar *point;
9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  int offset;
919560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_ARITY(2);
9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  find = valuePop(ctxt);
9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  str = valuePop(ctxt);
920160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  target = xmlBufferCreate();
9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (target) {
9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    point = xmlStrstr(str->stringval, find->stringval);
9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (point) {
9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      offset = (int)(point - str->stringval) + xmlStrlen(find->stringval);
9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlBufferAdd(target, &str->stringval[offset],
9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlStrlen(str->stringval) - offset);
9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
921160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlBufferContent(target)));
9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, str);
9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, find);
9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNormalizeFunction:
9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the normalize-space() XPath function
9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string normalize-space(string?)
9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The normalize-space function returns the argument string with white
9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space normalized by stripping leading and trailing whitespace
9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and replacing sequences of whitespace characters by a single
9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space. Whitespace characters are the same allowed by the S production
9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in XML. If the argument is omitted, it defaults to the context
9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node converted to a string, in other words the value of the context node.
9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr obj = NULL;
9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlChar *source = NULL;
9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlBufferPtr target;
9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlChar blank;
923860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (ctxt == NULL) return;
9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (nargs == 0) {
9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Use current context node */
9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      valuePush(ctxt,
9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlXPathCacheWrapString(ctxt->context,
9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCastNodeToString(ctxt->context->node)));
9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nargs = 1;
9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_ARITY(1);
9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_TYPE(XPATH_STRING);
9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  obj = valuePop(ctxt);
9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  source = obj->stringval;
9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  target = xmlBufferCreate();
9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (target && source) {
925660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Skip leading whitespaces */
9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*source))
9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      source++;
926060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Collapse intermediate whitespaces, and skip trailing whitespaces */
9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    blank = 0;
9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*source) {
9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      if (IS_BLANK_CH(*source)) {
9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	blank = 0x20;
9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      } else {
9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (blank) {
9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlBufferAdd(target, &blank, 1);
9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  blank = 0;
9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferAdd(target, source, 1);
9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      source++;
9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, obj);
9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTranslateFunction:
9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the translate() XPath function
9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string translate(string, string, string)
9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The translate function returns the first argument string with
9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurrences of characters in the second argument string replaced
9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the character at the corresponding position in the third argument
9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, translate("bar","abc","ABC") returns the string
9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BAr. If there is a character in the second argument string with no
9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character at a corresponding position in the third argument string
9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (because the second argument string is longer than the third argument
9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string), then occurrences of that character in the first argument
9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string are removed. For example, translate("--aaa--","abc-","ABC")
9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "AAA". If a character occurs more than once in second
9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then the first occurrence determines the replacement
9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character. If the third argument string is longer than the second
9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then excess characters are ignored.
9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr str;
9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr from;
9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr to;
9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferPtr target;
9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int offset, max;
9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar ch;
9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *point;
9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cptr;
9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(3);
9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    to = valuePop(ctxt);
9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    from = valuePop(ctxt);
9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = valuePop(ctxt);
9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    target = xmlBufferCreate();
9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (target) {
9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	max = xmlUTF8Strlen(to->stringval);
9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (cptr = str->stringval; (ch=*cptr); ) {
9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    offset = xmlUTF8Strloc(from->stringval, cptr);
9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (offset >= 0) {
9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (offset < max) {
9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    point = xmlUTF8Strpos(to->stringval, offset);
9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (point)
9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlBufferAdd(target, point, xmlUTF8Strsize(point, 1));
9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlBufferAdd(target, cptr, xmlUTF8Strsize(cptr, 1));
9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Step to next character in input */
9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cptr++;
9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ch & 0x80 ) {
9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* if not simple ascii, verify proper format */
9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ( (ch & 0xc0) != 0xc0 ) {
9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"xmlXPathTranslateFunction: Invalid UTF8 string\n");
9344df143a5041f03a22808b59c76698770b74692815Selim Gurun                    /* not asserting an XPath error is probably better */
9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* then skip over remaining bytes for this char */
9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ( (ch <<= 1) & 0x80 )
9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ( (*cptr++ & 0xc0) != 0x80 ) {
9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlGenericError(xmlGenericErrorContext,
9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "xmlXPathTranslateFunction: Invalid UTF8 string\n");
9352df143a5041f03a22808b59c76698770b74692815Selim Gurun                        /* not asserting an XPath error is probably better */
9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ch & 0x80) /* must have had error encountered */
9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, str);
9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, from);
9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, to);
9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathBooleanFunction:
9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the boolean() XPath function
9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean boolean(object)
9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The boolean function converts its argument to a boolean as follows:
9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - a number is true if and only if it is neither positive or
9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      negative zero nor NaN
9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - a node-set is true if and only if it is non-empty
9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - a string is true if and only if its length is non-zero
9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND);
9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlXPathCacheConvertBoolean(ctxt->context, cur);
9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, cur);
9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotFunction:
9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the not() XPath function
9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean not(boolean)
9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The not function returns true if its argument is false,
9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and false otherwise.
9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_BOOLEAN;
9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_BOOLEAN);
9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->boolval = ! ctxt->value->boolval;
9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrueFunction:
9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the true() XPath function
9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean true()
9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFalseFunction:
9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the false() XPath function
9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean false()
9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLangFunction:
9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the lang() XPath function
9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean lang(string)
9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lang function returns true or false depending on whether the
9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * language of the context node as specified by xml:lang attributes
9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is the same as or is a sublanguage of the language specified by
9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument string. The language of the context node is determined
9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the value of the xml:lang attribute on the context node, or, if
9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node has no xml:lang attribute, by the value of the
9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xml:lang attribute on the nearest ancestor of the context node that
9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * has an xml:lang attribute. If there is no such attribute, then lang
9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns false. If there is such an attribute, then lang returns
9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * true if the attribute value is equal to the argument ignoring case,
9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or if there is some suffix starting with - such that the attribute
9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value is equal to the argument ignoring that suffix of the attribute
9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value and ignoring case.
9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr val = NULL;
9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *theLang = NULL;
9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *lang;
9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = valuePop(ctxt);
9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lang = val->stringval;
9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    theLang = xmlNodeGetLang(ctxt->context->node);
9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((theLang != NULL) && (lang != NULL)) {
9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0;lang[i] != 0;i++)
9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toupper(lang[i]) != toupper(theLang[i]))
9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        goto not_equal;
9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((theLang[i] == 0) || (theLang[i] == '-'))
9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 1;
9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_equal:
9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (theLang != NULL)
9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((void *)theLang);
9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, val);
9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret));
9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNumberFunction:
9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the number() XPath function
9494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number number(object?)
9495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double res;
9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) {
9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0));
9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar* content = xmlNodeGetContent(ctxt->context->node);
9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathStringEvalNumber(content);
9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res));
9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(content);
9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur));
9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSumFunction:
9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the sum() XPath function
9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number sum(node-set)
9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The sum function returns the sum of the values of the nodes in
9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument node-set.
9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double res = 0.0;
9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
953760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((ctxt->value == NULL) ||
9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) {
9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < cur->nodesetval->nodeNr; i++) {
9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]);
9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res));
9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * To assure working code on multiple platforms, we want to only depend
9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upon the characteristic truncation of converting a floating point value
9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to an integer.  Unfortunately, because of the different storage sizes
9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of our internal floating point value (double) and integer (int), we
9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * can't directly convert (see bug 301162).  This macro is a messy
9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 'workaround'
9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XTRUNC(f, v)            \
9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    f = fmod((v), INT_MAX);     \
9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    f = (v) - (f) + (double)((int)(f));
9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFloorFunction:
9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the floor() XPath function
9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number floor(number)
9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The floor function returns the largest (closest to positive infinity)
9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not greater than the argument and that is an integer.
9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double f;
9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XTRUNC(f, ctxt->value->floatval);
9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (f != ctxt->value->floatval) {
9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval > 0)
9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f;
9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f - 1;
9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCeilingFunction:
9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the ceiling() XPath function
9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number ceiling(number)
9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ceiling function returns the smallest (closest to negative infinity)
9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not less than the argument and that is an integer.
9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double f;
9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval = ceil(ctxt->value->floatval);
9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XTRUNC(f, ctxt->value->floatval);
9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (f != ctxt->value->floatval) {
9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval > 0)
9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f + 1;
9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value->floatval < 0 && f == 0)
9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->value->floatval = xmlXPathNZERO;
9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->value->floatval = f;
9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoundFunction:
9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the round() XPath function
9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number round(number)
9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The round function returns the number that is closest to the
9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument and that is an integer. If there are two such numbers,
9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the one that is even is returned.
9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double f;
9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlXPathIsNaN(ctxt->value->floatval)) ||
9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlXPathIsInf(ctxt->value->floatval) == 1) ||
9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlXPathIsInf(ctxt->value->floatval) == -1) ||
9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->value->floatval == 0.0))
9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XTRUNC(f, ctxt->value->floatval);
9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value->floatval < 0) {
9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval < f - 0.5)
9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f - 1;
965660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	else
9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f;
9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval == 0)
9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNZERO;
9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval < f + 0.5)
9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f;
966360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	else
9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f + 1;
9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			The Parser					*
9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a few forward declarations since we use a recursive call based
9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation.
9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort);
9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter);
9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt);
9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt);
9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt,
9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                  int qualified);
9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCurrentChar:
9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context
9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  pointer to the beginning of the char
9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  pointer to the length of the char read
9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple
9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer.
9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length
9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) {
9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char c;
9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int val;
9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->cur;
9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * We are supposed to handle UTF8, check it's valid
9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * From rfc2044: encoding of the Unicode values on UTF-8:
9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * UCS-4 range (hex.)           UTF-8 octet sequence (binary)
9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 0000 0000-0000 007F   0xxxxxxx
9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 0000 0080-0000 07FF   110xxxxx 10xxxxxx
971460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     * 0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check for the 0x110000 limit too
9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = *cur;
9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (c & 0x80) {
9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur[1] & 0xc0) != 0x80)
9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto encoding_error;
9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((c & 0xe0) == 0xe0) {
9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur[2] & 0xc0) != 0x80)
9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto encoding_error;
9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c & 0xf0) == 0xf0) {
9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((c & 0xf8) != 0xf0) ||
9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((cur[3] & 0xc0) != 0x80))
9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto encoding_error;
9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* 4-byte code */
9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*len = 4;
9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val = (cur[0] & 0x7) << 18;
9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= (cur[1] & 0x3f) << 12;
9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= (cur[2] & 0x3f) << 6;
9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= cur[3] & 0x3f;
9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      /* 3-byte code */
9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*len = 3;
9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val = (cur[0] & 0xf) << 12;
9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= (cur[1] & 0x3f) << 6;
9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= cur[2] & 0x3f;
9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  /* 2-byte code */
9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *len = 2;
9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val = (cur[0] & 0x1f) << 6;
9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val |= cur[1] & 0x3f;
9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR(val)) {
9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR0(XPATH_INVALID_CHAR_ERROR);
975160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* 1-byte code */
9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*len = 1;
9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((int) *cur);
9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error:
9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If we detect an UTF8 error that probably means that the
9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * input encoding didn't get properly advertised in the
9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * declaration header. Report the error and switch the encoding
9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * to ISO-Latin-1 (if you don't like this policy, just declare the
9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * encoding !)
9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *len = 0;
9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XP_ERROR0(XPATH_ENCODING_ERROR);
9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseNCName:
9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML namespace non qualified name.
9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 3] NCName ::= (Letter | '_') (NCNameChar)*
9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' |
9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                       CombiningChar | Extender
9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL
9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNCName(xmlXPathParserContextPtr ctxt) {
9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *in;
9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count = 0;
9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL);
9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Accelerator for simple ASCII names
9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    in = ctxt->cur;
9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((*in >= 0x61) && (*in <= 0x7A)) ||
9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((*in >= 0x41) && (*in <= 0x5A)) ||
9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*in == '_')) {
9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in++;
9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (((*in >= 0x61) && (*in <= 0x7A)) ||
9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x41) && (*in <= 0x5A)) ||
9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x30) && (*in <= 0x39)) ||
9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == '_') || (*in == '.') ||
9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == '-'))
9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in++;
9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((*in == ' ') || (*in == '>') || (*in == '/') ||
9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (*in == '[') || (*in == ']') || (*in == ':') ||
9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (*in == '@') || (*in == '*')) {
9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    count = in - ctxt->cur;
9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (count == 0)
9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(ctxt->cur, count);
9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cur = in;
9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathParseNameComplex(ctxt, 0));
9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseQName:
9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
982360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @prefix:  a xmlChar **
9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML qualified name
9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 5] QName ::= (Prefix ':')? LocalPart
9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 6] Prefix ::= NCName
9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 7] LocalPart ::= NCName
9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the function returns the local part, and prefix is updated
9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   to get the Prefix if any.
9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) {
9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *prefix = NULL;
9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathParseNCName(ctxt);
984360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret && CUR == ':') {
9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *prefix = ret;
9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathParseNCName(ctxt);
9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseName:
9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML name
9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  CombiningChar | Extender
9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)*
9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL
9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseName(xmlXPathParserContextPtr ctxt) {
9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *in;
9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count = 0;
9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL);
9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Accelerator for simple ASCII names
9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    in = ctxt->cur;
9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((*in >= 0x61) && (*in <= 0x7A)) ||
9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((*in >= 0x41) && (*in <= 0x5A)) ||
9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*in == '_') || (*in == ':')) {
9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in++;
9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (((*in >= 0x61) && (*in <= 0x7A)) ||
9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x41) && (*in <= 0x5A)) ||
9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x30) && (*in <= 0x39)) ||
9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == '_') || (*in == '-') ||
9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == ':') || (*in == '.'))
9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in++;
9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((*in > 0) && (*in < 0x80)) {
9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    count = in - ctxt->cur;
9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(ctxt->cur, count);
9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cur = in;
9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathParseNameComplex(ctxt, 1));
9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) {
9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar buf[XML_MAX_NAMELEN + 5];
9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0, l;
9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int c;
9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Handler for more complex cases
9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = CUR_CHAR(l);
9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (c == '[') || (c == ']') || (c == '@') || /* accelerators */
9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (c == '*') || /* accelerators */
9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!IS_LETTER(c) && (c != '_') &&
9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         ((qualified) && (c != ':')))) {
9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (c == '.') || (c == '-') ||
991760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    (c == '_') || ((qualified) && (c == ':')) ||
9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_COMBINING(c)) ||
9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_EXTENDER(c)))) {
9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	COPY_BUF(l,buf,len,c);
9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXTL(l);
9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	c = CUR_CHAR(l);
9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len >= XML_MAX_NAMELEN) {
9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Okay someone managed to make a huge name, so he's ready to pay
9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * for the processing speed.
9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *buffer;
9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int max = len * 2;
993060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar));
9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (buffer == NULL) {
9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XP_ERRORNULL(XPATH_MEMORY_ERROR);
9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memcpy(buffer, buf, len);
9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */
9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (c == '.') || (c == '-') ||
993860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		   (c == '_') || ((qualified) && (c == ':')) ||
9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (IS_COMBINING(c)) ||
9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (IS_EXTENDER(c))) {
9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len + 10 > max) {
9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    max *= 2;
9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    buffer = (xmlChar *) xmlRealloc(buffer,
9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                            max * sizeof(xmlChar));
9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (buffer == NULL) {
9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_ERRORNULL(XPATH_MEMORY_ERROR);
9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		COPY_BUF(l,buffer,len,c);
9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXTL(l);
9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		c = CUR_CHAR(l);
9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    buffer[len] = 0;
9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(buffer);
9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len == 0)
9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlStrndup(buf, len));
9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_FRAC 20
9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * These are used as divisors for the fractional part of a number.
9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since the table includes 1.0 (representing '0' fractional digits),
9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it must be dimensioned at MAX_FRAC+1 (bug 133921)
9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double my_pow10[MAX_FRAC+1] = {
9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    1.0, 10.0, 100.0, 1000.0, 10000.0,
9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0,
9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0,
9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    100000000000000.0,
9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    1000000000000000.0, 10000000000000000.0, 100000000000000000.0,
9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0
9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringEvalNumber:
9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  A string to scan
9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [30a]  Float  ::= Number ('e' Digits?)?
9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [30]   Number ::=   Digits ('.' Digits?)?
998560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                    | '.' Digits
9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [31]   Digits ::=   [0-9]+
9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number in the string
9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In complement of the Number expression, this function also handles
9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * negative values : '-' Number.
9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the double value.
9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringEvalNumber(const xmlChar *str) {
9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = str;
9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ok = 0;
9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isneg = 0;
10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int exponent = 0;
10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_exponent_negative = 0;
10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long tmp = 0;
10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double temp;
10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return(0);
10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) cur++;
10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) {
10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlXPathNAN);
10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == '-') {
10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isneg = 1;
10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * tmp/temp is a workaround against a gcc compiler bug
10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * http://veillard.com/gcc.bug
10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10;
10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (*cur - '0');
10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (double) tmp;
10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret + temp;
10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10 + (*cur - '0');
10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == '.') {
10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int v, frac = 0;
10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	double fraction = 0;
10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
10044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((*cur < '0') || (*cur > '9')) && (!ok)) {
10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathNAN);
10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) {
10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    v = (*cur - '0');
10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fraction = fraction * 10 + v;
10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    frac = frac + 1;
10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fraction /= my_pow10[frac];
10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret + fraction;
10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur >= '0') && (*cur <= '9'))
10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur == 'e') || (*cur == 'E')) {
10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      cur++;
10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      if (*cur == '-') {
10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	is_exponent_negative = 1;
10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      } else if (*cur == '+') {
10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      while ((*cur >= '0') && (*cur <= '9')) {
10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exponent = exponent * 10 + (*cur - '0');
10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) cur++;
10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != 0) return(xmlXPathNAN);
10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isneg) ret = -ret;
10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_exponent_negative) exponent = -exponent;
10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret *= pow(10.0, (double)exponent);
10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNumber:
10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [30]   Number ::=   Digits ('.' Digits?)?
1008460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                    | '.' Digits
10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [31]   Digits ::=   [0-9]+
10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number, then push it on the stack
10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNumber(xmlXPathParserContextPtr ctxt)
10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret = 0.0;
10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ok = 0;
10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int exponent = 0;
10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_exponent_negative = 0;
10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long tmp = 0;
10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double temp;
10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) {
10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_NUMBER_ERROR);
10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * tmp/temp is a workaround against a gcc compiler bug
10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * http://veillard.com/gcc.bug
10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR >= '0') && (CUR <= '9')) {
10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10;
10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (CUR - '0');
10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ok = 1;
10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (double) tmp;
10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret + temp;
10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR >= '0') && (CUR <= '9')) {
10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10 + (CUR - '0');
10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '.') {
10129df143a5041f03a22808b59c76698770b74692815Selim Gurun	int v, frac = 0;
10130df143a5041f03a22808b59c76698770b74692815Selim Gurun	double fraction = 0;
10131df143a5041f03a22808b59c76698770b74692815Selim Gurun
10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (((CUR < '0') || (CUR > '9')) && (!ok)) {
10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            XP_ERROR(XPATH_NUMBER_ERROR);
10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10136df143a5041f03a22808b59c76698770b74692815Selim Gurun        while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) {
10137df143a5041f03a22808b59c76698770b74692815Selim Gurun	    v = (CUR - '0');
10138df143a5041f03a22808b59c76698770b74692815Selim Gurun	    fraction = fraction * 10 + v;
10139df143a5041f03a22808b59c76698770b74692815Selim Gurun	    frac = frac + 1;
10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            NEXT;
10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10142df143a5041f03a22808b59c76698770b74692815Selim Gurun        fraction /= my_pow10[frac];
10143df143a5041f03a22808b59c76698770b74692815Selim Gurun        ret = ret + fraction;
10144df143a5041f03a22808b59c76698770b74692815Selim Gurun        while ((CUR >= '0') && (CUR <= '9'))
10145df143a5041f03a22808b59c76698770b74692815Selim Gurun            NEXT;
10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == 'e') || (CUR == 'E')) {
10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '-') {
10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_exponent_negative = 1;
10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            NEXT;
10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (CUR == '+') {
10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while ((CUR >= '0') && (CUR <= '9')) {
10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            exponent = exponent * 10 + (CUR - '0');
10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            NEXT;
10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (is_exponent_negative)
10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            exponent = -exponent;
10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret *= pow(10.0, (double) exponent);
10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0,
10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlXPathCacheNewFloat(ctxt->context, ret), NULL);
10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseLiteral:
10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal
10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [29]   Literal ::=   '"' [^"]* '"'
10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | "'" [^']* "'"
10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value found or NULL in case of error
10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) {
10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *q;
10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '"') {
10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '"'))
10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '\'') {
10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '\''))
10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERRORNULL(XPATH_START_LITERAL_ERROR);
10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLiteral:
10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal and push it on the stack.
10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [29]   Literal ::=   '"' [^"]* '"'
10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | "'" [^']* "'"
10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: xmlXPathCompLiteral memory allocation could be improved.
10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) {
10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *q;
10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '"') {
10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '"'))
10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '\'') {
10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '\''))
10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_START_LITERAL_ERROR);
10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) return;
10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0,
10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           xmlXPathCacheNewString(ctxt->context, ret), NULL);
10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ret);
10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompVariableReference:
10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a VariableReference, evaluate it and push it on the stack.
10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings consist of a mapping from variable names
10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to variable values. The value of a variable is an object, which can be
10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of any of the types that are possible for the value of an expression,
10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and may also be of additional types not specified here.
10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Early evaluation is possible since:
10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings [...] used to evaluate a subexpression are
1027160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * always the same as those used to evaluate the containing expression.
10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1027360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [36]   VariableReference ::=   '$' QName
10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) {
10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *prefix;
10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '$') {
10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_VARIABLE_REF_ERROR);
10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlXPathParseQName(ctxt, &prefix);
10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_VARIABLE_REF_ERROR);
10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->comp->last = -1;
10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0,
10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           name, prefix);
10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) {
10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_UNDEF_VARIABLE_ERROR);
10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNodeType:
10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  a name string
10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is the name given a NodeType one.
10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [38]   NodeType ::=   'comment'
10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | 'text'
10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | 'processing-instruction'
10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | 'node'
10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 otherwise
10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNodeType(const xmlChar *name) {
10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "node"))
10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "text"))
10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "comment"))
10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "processing-instruction"))
10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFunctionCall:
10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [16]   FunctionCall ::=   FunctionName '(' ( Argument ( ',' Argument)*)? ')'
1033260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [17]   Argument ::=   Expr
10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a function call, the evaluation of all arguments are
10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pushed on the stack
10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) {
10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *prefix;
10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbargs = 0;
10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sort = 1;
10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlXPathParseQName(ctxt, &prefix);
10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
1034660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlFree(prefix);
10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix == NULL)
10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Calling function %s\n",
10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			name);
10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n",
10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prefix, name);
10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '(') {
10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Optimization for count(): we don't need the node-set to be sorted.
10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((prefix == NULL) && (name[0] == 'c') &&
10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrEqual(name, BAD_CAST "count"))
10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sort = 0;
10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->comp->last = -1;
10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != ')') {
10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (CUR != 0) {
10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int op1 = ctxt->comp->last;
10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->comp->last = -1;
10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompileExpr(ctxt, sort);
1037960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (ctxt->error != XPATH_EXPRESSION_OK) {
1038060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlFree(name);
1038160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlFree(prefix);
1038260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return;
1038360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0);
10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbargs++;
10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR == ')') break;
10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR != ',') {
10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XP_ERROR(XPATH_EXPR_ERROR);
10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0,
10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           name, prefix);
10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPrimaryExpr:
10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1040460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [15]   PrimaryExpr ::=   VariableReference
10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                | '(' Expr ')'
1040660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                | Literal
1040760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                | Number
1040860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                | FunctionCall
10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a primary expression.
10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) {
10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '$') xmlXPathCompVariableReference(ctxt);
10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (CUR == '(') {
10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 1);
10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != ')') {
10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_EXPR_ERROR);
10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) {
10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompNumber(ctxt);
10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((CUR == '\'') || (CUR == '"')) {
10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompLiteral(ctxt);
10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompFunctionCall(ctxt);
10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFilterExpr:
10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1044060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [20]   FilterExpr ::=   PrimaryExpr
1044160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *               | FilterExpr Predicate
10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a filter expression.
10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Square brackets are used to filter expressions in the same way that
10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they are used in location paths. It is an error if the expression to
10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be filtered does not evaluate to a node-set. The context node list
10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used for evaluating the expression in square brackets is the node-set
10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be filtered listed in document order.
10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) {
10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompPrimaryExpr(ctxt);
10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
1045660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '[') {
10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompPredicate(ctxt, 1);
10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1046260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathScanName:
10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Trickery: parse an XML name but without consuming the input flow
10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Needed to avoid insanity in the parser state.
10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  CombiningChar | Extender
10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)*
10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] Names ::= Name (S Name)*
10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL
10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathScanName(xmlXPathParserContextPtr ctxt) {
10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0, l;
10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int c;
10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->cur;
10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = CUR_CHAR(l);
10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!IS_LETTER(c) && (c != '_') &&
10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (c != ':'))) {
10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (c == '.') || (c == '-') ||
1050160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    (c == '_') || (c == ':') ||
10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_COMBINING(c)) ||
10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_EXTENDER(c)))) {
10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len += l;
10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXTL(l);
10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	c = CUR_CHAR(l);
10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlStrndup(cur, ctxt->cur - cur);
10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->cur = cur;
10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPathExpr:
10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1051760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [19]   PathExpr ::=   LocationPath
1051860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *               | FilterExpr
1051960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *               | FilterExpr '/' RelativeLocationPath
1052060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *               | FilterExpr '//' RelativeLocationPath
10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a path expression.
10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator and // operators combine an arbitrary expression
10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a relative location path. It is an error if the expression
10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * does not evaluate to a node-set.
10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator does composition in the same way as when / is
10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used in a location path. As in location paths, // is short for
10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * /descendant-or-self::node()/.
10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) {
10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int lc = 1;           /* Should we branch to LocationPath ?         */
10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name = NULL; /* we may have to preparse a name to find out */
10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
1053760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((CUR == '$') || (CUR == '(') ||
1053860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	(IS_ASCII_DIGIT(CUR)) ||
10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (CUR == '\'') || (CUR == '"') ||
10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) {
10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 0;
10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '*') {
10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative or absolute location path */
10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '/') {
10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative or absolute location path */
10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '@') {
10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative abbreviated attribute location path */
10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '.') {
10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative abbreviated attribute location path */
10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Problem is finding if we have a name here whether it's:
10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - a nodetype
10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - a function call in which case it's followed by '('
10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - an axis in which case it's followed by ':'
10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - a element name
10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * We do an a priori analysis here rather than having to
10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * maintain parsed token content through the recursive function
10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * calls. This looks uglier but makes the code easier to
10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * read/write/debug.
10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathScanName(ctxt);
10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) {
10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "PathExpr: Axis\n");
10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lc = 1;
10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (name != NULL) {
10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int len =xmlStrlen(name);
10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1057860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (NXT(len) != 0) {
10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (NXT(len) == '/') {
10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* element name */
10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "PathExpr: AbbrRelLocation\n");
10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (IS_BLANK_CH(NXT(len))) {
10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* ignore blanks */
10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ;
10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (NXT(len) == ':') {
10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "PathExpr: AbbrRelLocation\n");
10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((NXT(len) == '(')) {
10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Note Type or Function */
10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlXPathIsNodeType(name)) {
10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlGenericError(xmlGenericErrorContext,
10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"PathExpr: Type search\n");
10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lc = 1;
10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlGenericError(xmlGenericErrorContext,
10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"PathExpr: function call\n");
10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lc = 0;
10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((NXT(len) == '[')) {
10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* element name */
10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "PathExpr: AbbrRelLocation\n");
10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((NXT(len) == '<') || (NXT(len) == '>') ||
10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (NXT(len) == '=')) {
10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len++;
10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (NXT(len) == 0) {
10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"PathExpr: AbbrRelLocation\n");
10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* element name */
10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lc = 1;
10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* make sure all cases are covered explicitly */
10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_EXPR_ERROR);
10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1064560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lc) {
10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '/') {
10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0);
10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompLocationPath(ctxt);
10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompFilterExpr(ctxt);
10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((CUR == '/') && (NXT(1) == '/')) {
10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(2);
10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0);
10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompRelativeLocationPath(ctxt);
10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == '/') {
10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompRelativeLocationPath(ctxt);
10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnionExpr:
10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1067760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [18]   UnionExpr ::=   PathExpr
1067860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *               | UnionExpr '|' PathExpr
10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an union expression.
10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) {
10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompPathExpr(ctxt);
10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '|') {
10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompPathExpr(ctxt);
10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0);
10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnaryExpr:
10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1070660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [27]   UnaryExpr ::=   UnionExpr
1070760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                   | '-' UnaryExpr
10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an unary expression.
10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) {
10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int minus = 0;
10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int found = 0;
10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '-') {
10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        minus = 1 - minus;
10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	found = 1;
10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompUnionExpr(ctxt);
10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (found) {
10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (minus)
10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0);
10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0);
10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompMultiplicativeExpr:
10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1073960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [26]   MultiplicativeExpr ::=   UnaryExpr
1074060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                   | MultiplicativeExpr MultiplyOperator UnaryExpr
1074160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                   | MultiplicativeExpr 'div' UnaryExpr
1074260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                   | MultiplicativeExpr 'mod' UnaryExpr
10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [34]   MultiplyOperator ::=   '*'
10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression.
10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) {
10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompUnaryExpr(ctxt);
10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
1075360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    while ((CUR == '*') ||
10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) ||
10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) {
10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op = -1;
10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '*') {
10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = 0;
10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == 'd') {
10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = 1;
10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(3);
10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == 'm') {
10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = 2;
10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(3);
10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompUnaryExpr(ctxt);
10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0);
10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAdditiveExpr:
10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1078160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [25]   AdditiveExpr ::=   MultiplicativeExpr
1078260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                   | AdditiveExpr '+' MultiplicativeExpr
1078360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                   | AdditiveExpr '-' MultiplicativeExpr
10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression.
10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) {
10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompMultiplicativeExpr(ctxt);
10792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '+') || (CUR == '-')) {
10795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int plus;
10796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '+') plus = 1;
10799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else plus = 0;
10800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompMultiplicativeExpr(ctxt);
10803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0);
10805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelationalExpr:
10811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1081360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [24]   RelationalExpr ::=   AdditiveExpr
1081460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | RelationalExpr '<' AdditiveExpr
1081560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | RelationalExpr '>' AdditiveExpr
1081660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | RelationalExpr '<=' AdditiveExpr
1081760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | RelationalExpr '>=' AdditiveExpr
10818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  A <= B > C is allowed ? Answer from James, yes with
10820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  (AdditiveExpr <= AdditiveExpr) > AdditiveExpr
10821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  which is basically what got implemented.
10822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Relational expression, then push the result
10824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the stack
10825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) {
10829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompAdditiveExpr(ctxt);
10830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '<') ||
10833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           (CUR == '>') ||
10834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == '<') && (NXT(1) == '=')) ||
10835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == '>') && (NXT(1) == '='))) {
10836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int inf, strict;
10837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '<') inf = 1;
10840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else inf = 0;
10841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (NXT(1) == '=') strict = 0;
10842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else strict = 1;
10843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!strict) NEXT;
10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompAdditiveExpr(ctxt);
10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict);
10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompEqualityExpr:
10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1085760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [23]   EqualityExpr ::=   RelationalExpr
1085860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | EqualityExpr '=' RelationalExpr
1085960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | EqualityExpr '!=' RelationalExpr
10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  A != B != C is allowed ? Answer from James, yes with
10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  (RelationalExpr = RelationalExpr) = RelationalExpr
10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  (RelationalExpr != RelationalExpr) != RelationalExpr
10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  which is basically what got implemented.
10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Equality expression.
10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) {
10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompRelationalExpr(ctxt);
10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) {
10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int eq;
10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '=') eq = 1;
10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else eq = 0;
10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!eq) NEXT;
10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompRelationalExpr(ctxt);
10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0);
10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAndExpr:
10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1089460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [22]   AndExpr ::=   EqualityExpr
1089560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | AndExpr 'and' EqualityExpr
10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an AND expression.
10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) {
10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompEqualityExpr(ctxt);
10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) {
10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        SKIP(3);
10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompEqualityExpr(ctxt);
10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0);
10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompileExpr:
10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1092060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [14]   Expr ::=   OrExpr
1092160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [21]   OrExpr ::=   AndExpr
1092260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                 | OrExpr 'or' AndExpr
10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and compile an expression
10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) {
10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompAndExpr(ctxt);
10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == 'o') && (NXT(1) == 'r')) {
10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        SKIP(2);
10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompAndExpr(ctxt);
10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0);
10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) {
10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* more ops could be optimized too */
10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* This is the main place to eliminate sorting for
10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* operations which don't require a sorted node-set.
10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* E.g. count().
10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0);
10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPredicate:
10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filter:  act as a filter
10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [8]   Predicate ::=   '[' PredicateExpr ']'
1095760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [9]   PredicateExpr ::=   Expr
10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a predicate expression
10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) {
10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int op1 = ctxt->comp->last;
10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '[') {
10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->comp->last = -1;
10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This call to xmlXPathCompileExpr() will deactivate sorting
10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of the predicate result.
10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Sorting is still activated for filters, since I'm not
10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  sure if needed. Normally sorting should not be needed, since
10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  a filter can only diminish the number of items in a sequence,
10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  but won't change its order; so if the initial sequence is sorted,
10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  subsequent sorting is not needed.
10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! filter)
10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 0);
10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 1);
10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != ']') {
10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (filter)
10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0);
10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0);
10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNodeTest:
11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test:  pointer to a xmlXPathTestVal
11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  pointer to a xmlXPathTypeVal
11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix:  placeholder for a possible name prefix
11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7] NodeTest ::=   NameTest
11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | NodeType '(' ')'
11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | 'processing-instruction' '(' Literal ')'
11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] NameTest ::=  '*'
11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | NCName ':' '*'
11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | QName
11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [38] NodeType ::= 'comment'
11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		   | 'text'
11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		   | 'processing-instruction'
11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		   | 'node'
11019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the name found and updates @test, @type and @prefix appropriately
11021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test,
11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	             xmlXPathTypeVal *type, const xmlChar **prefix,
11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlChar *name) {
11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int blanks;
11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((test == NULL) || (type == NULL) || (prefix == NULL)) {
11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	STRANGE;
11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *type = (xmlXPathTypeVal) 0;
11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *test = (xmlXPathTestVal) 0;
11034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *prefix = NULL;
11035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) && (CUR == '*')) {
11038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * All elements
11040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
11041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*test = NODE_TEST_ALL;
11043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
11044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
11047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathParseNCName(ctxt);
11048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
11049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERRORNULL(XPATH_EXPR_ERROR);
11050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    blanks = IS_BLANK_CH(CUR);
11053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '(') {
11055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * NodeType or PI search
11058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
11059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(name, BAD_CAST "comment"))
11060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_COMMENT;
11061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlStrEqual(name, BAD_CAST "node"))
11062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_NODE;
11063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlStrEqual(name, BAD_CAST "processing-instruction"))
11064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_PI;
11065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlStrEqual(name, BAD_CAST "text"))
11066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_TEXT;
11067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
11068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
11069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
11070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_EXPR_ERROR);
11071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*test = NODE_TEST_TYPE;
1107460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
11075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*type == NODE_TYPE_PI) {
11077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Specific case: search a PI by name.
11079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
11080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
11081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
11082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = NULL;
11083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR != ')') {
11084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = xmlXPathParseLiteral(ctxt);
11085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR NULL;
11086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*test = NODE_TEST_PI;
11087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != ')') {
11091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
11092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
11093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_UNCLOSED_ERROR);
11094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(name);
11097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *test = NODE_TEST_NAME;
11099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!blanks) && (CUR == ':')) {
11100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Since currently the parser context don't have a
11104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * namespace list associated:
11105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * The namespace name for this prefix can be computed
11106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * only at evaluation time. The compilation is done
11107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * outside of any context.
11108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
11109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
11110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*prefix = xmlXPathNsLookup(ctxt->context, name);
11111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (name != NULL)
11112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
11113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*prefix == NULL) {
11114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
11115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
11117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*prefix = name;
11118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '*') {
11121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * All elements
11123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
11124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
11125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *test = NODE_TEST_ALL;
11126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
11127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathParseNCName(ctxt);
11130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (name == NULL) {
11131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_EXPR_ERROR);
11132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(name);
11135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAxisName:
11139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  a preparsed name token
11140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] AxisName ::=   'ancestor'
11142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'ancestor-or-self'
11143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'attribute'
11144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'child'
11145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'descendant'
11146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'descendant-or-self'
11147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'following'
11148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'following-sibling'
11149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'namespace'
11150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'parent'
11151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'preceding'
11152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'preceding-sibling'
11153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'self'
11154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the axis or 0
11156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathAxisVal
11158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAxisName(const xmlChar *name) {
11159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathAxisVal ret = (xmlXPathAxisVal) 0;
11160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (name[0]) {
11161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'a':
11162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "ancestor"))
11163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_ANCESTOR;
11164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "ancestor-or-self"))
11165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_ANCESTOR_OR_SELF;
11166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "attribute"))
11167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_ATTRIBUTE;
11168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'c':
11170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "child"))
11171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_CHILD;
11172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'd':
11174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "descendant"))
11175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_DESCENDANT;
11176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "descendant-or-self"))
11177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_DESCENDANT_OR_SELF;
11178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'f':
11180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "following"))
11181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_FOLLOWING;
11182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "following-sibling"))
11183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_FOLLOWING_SIBLING;
11184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'n':
11186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "namespace"))
11187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_NAMESPACE;
11188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'p':
11190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "parent"))
11191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_PARENT;
11192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "preceding"))
11193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_PRECEDING;
11194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "preceding-sibling"))
11195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_PRECEDING_SIBLING;
11196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 's':
11198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "self"))
11199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_SELF;
11200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
11203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompStep:
11207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] Step ::=   AxisSpecifier NodeTest Predicate*
1121060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                  | AbbreviatedStep
11211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] AbbreviatedStep ::=   '.' | '..'
11213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] AxisSpecifier ::= AxisName '::'
11215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | AbbreviatedAxisSpecifier
11216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13] AbbreviatedAxisSpecifier ::= '@'?
11218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified for XPtr range support as:
11220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [4xptr] Step ::= AxisSpecifier NodeTest Predicate*
11222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | AbbreviatedStep
11223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | 'range-to' '(' Expr ')' Predicate*
11224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile one step in a Location Path
11226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A location step of . is short for self::node(). This is
11227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * particularly useful in conjunction with //. For example, the
11228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location path .//para is short for
11229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * self::node()/descendant-or-self::node()/child::para
11230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select all para descendant elements of the context
11231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node.
11232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Similarly, a location step of .. is short for parent::node().
11233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For example, ../title is short for parent::node()/child::title
11234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select the title children of the parent of the context
11235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node.
11236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompStep(xmlXPathParserContextPtr ctxt) {
11239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int rangeto = 0;
11241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int op2 = -1;
11242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == '.') && (NXT(1) == '.')) {
11246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP(2);
11247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT,
11249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '.') {
11251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *name = NULL;
11255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *prefix = NULL;
11256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathTestVal test = (xmlXPathTestVal) 0;
11257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathAxisVal axis = (xmlXPathAxisVal) 0;
11258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathTypeVal type = (xmlXPathTypeVal) 0;
11259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1;
11260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * The modification needed for XPointer change to the production
11263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
11264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->xptr) {
11266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = xmlXPathParseNCName(ctxt);
11267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) {
11268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                op2 = ctxt->comp->last;
11269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
11270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (CUR != '(') {
11272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_ERROR(XPATH_EXPR_ERROR);
11273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompileExpr(ctxt, 1);
11278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */
11279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR;
11280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (CUR != ')') {
11283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_ERROR(XPATH_EXPR_ERROR);
11284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rangeto = 1;
11287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto eval_predicates;
11288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '*') {
11292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    axis = AXIS_CHILD;
11293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name == NULL)
11295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = xmlXPathParseNCName(ctxt);
11296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL) {
11297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		axis = xmlXPathIsAxisName(name);
11298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (axis != 0) {
11299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    SKIP_BLANKS;
11300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((CUR == ':') && (NXT(1) == ':')) {
11301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			SKIP(2);
11302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(name);
11303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			name = NULL;
11304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
11305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* an element name can conflict with an axis one :-\ */
11306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			axis = AXIS_CHILD;
11307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
11308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
11309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    axis = AXIS_CHILD;
11310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (CUR == '@') {
11312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		axis = AXIS_ATTRIBUTE;
11314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		axis = AXIS_CHILD;
11316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11319df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (ctxt->error != XPATH_EXPRESSION_OK) {
11320df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlFree(name);
11321df143a5041f03a22808b59c76698770b74692815Selim Gurun            return;
11322df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
11323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name);
11325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (test == 0)
11326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
11327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((prefix != NULL) && (ctxt->context != NULL) &&
11329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->context->flags & XML_XPATH_CHECKNS)) {
11330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) {
11331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR);
11332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
11336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Basis : computing new set\n");
11337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Basis : ");
11341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value == NULL)
11342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "no value\n");
11343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->nodesetval == NULL)
11344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "Empty\n");
11345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
11346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval);
11347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecteval_predicates:
11351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	op1 = ctxt->comp->last;
11353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->comp->last = -1;
11354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (CUR == '[') {
11357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompPredicate(ctxt, 0);
11358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (rangeto) {
11362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0);
11363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
11364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis,
11366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   test, type, (void *)prefix, (void *)name);
11367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Step : ");
11371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL)
11372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "no value\n");
11373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (ctxt->value->nodesetval == NULL)
11374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Empty\n");
11375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
11376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericErrorContextNodeSet(xmlGenericErrorContext,
11377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->value->nodesetval);
11378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelativeLocationPath:
11383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1138560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [3]   RelativeLocationPath ::=   Step
1138660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                     | RelativeLocationPath '/' Step
1138760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                     | AbbreviatedRelativeLocationPath
1138860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [11]  AbbreviatedRelativeLocationPath ::=   RelativeLocationPath '//' Step
11389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a relative location path.
11391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelativeLocationPath
11394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(xmlXPathParserContextPtr ctxt) {
11395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == '/') && (NXT(1) == '/')) {
11397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP(2);
11398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		         NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '/') {
11402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
11403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompStep(ctxt);
11406df143a5041f03a22808b59c76698770b74692815Selim Gurun    CHECK_ERROR;
11407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '/') {
11409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((CUR == '/') && (NXT(1) == '/')) {
11410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(2);
11411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
11412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompStep(ctxt);
11415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == '/') {
11416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
11417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
11418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompStep(ctxt);
11419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLocationPath:
11426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1142860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [1]   LocationPath ::=   RelativeLocationPath
1142960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                     | AbsoluteLocationPath
11430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [2]   AbsoluteLocationPath ::=   '/' RelativeLocationPath?
1143160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                     | AbbreviatedAbsoluteLocationPath
1143260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  [10]   AbbreviatedAbsoluteLocationPath ::=
1143360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *                           '//' RelativeLocationPath
11434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a location path
11436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * // is short for /descendant-or-self::node()/. For example,
11438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * //para is short for /descendant-or-self::node()/child::para and
11439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so will select any para element in the document (even a para element
11440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is a document element will be selected by //para since the
11441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document element node is a child of the root node); div//para is
11442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * short for div/descendant-or-self::node()/child::para and so will
11443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * select all para descendants of div children.
11444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) {
11447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '/') {
11449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompRelativeLocationPath(ctxt);
11450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (CUR == '/') {
11452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((CUR == '/') && (NXT(1) == '/')) {
11453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP(2);
11454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompRelativeLocationPath(ctxt);
11458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (CUR == '/') {
11459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((CUR != 0 ) &&
11462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') ||
11463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (CUR == '@') || (CUR == '*')))
11464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCompRelativeLocationPath(ctxt);
11465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11466df143a5041f03a22808b59c76698770b74692815Selim Gurun	    CHECK_ERROR;
11467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
11472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1147360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *		XPath precompiled expression evaluation			*
11474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
11475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
11476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op);
11479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1148260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlXPathDebugDumpStepAxis(xmlXPathStepOpPtr op,
11483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  int nbNodes)
11484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "new step : ");
1148660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    switch (op->value) {
11487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR:
11488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' ");
11489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR_OR_SELF:
11491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'ancestors-or-self' ");
11493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ATTRIBUTE:
11495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'attributes' ");
11496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_CHILD:
11498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'child' ");
11499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT:
11501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'descendant' ");
11502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT_OR_SELF:
11504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'descendant-or-self' ");
11506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING:
11508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'following' ");
11509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING_SIBLING:
11511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'following-siblings' ");
11513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_NAMESPACE:
11515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'namespace' ");
11516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PARENT:
11518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'parent' ");
11519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING:
11521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'preceding' ");
11522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING_SIBLING:
11524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'preceding-sibling' ");
11526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_SELF:
11528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'self' ");
11529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
11532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	" context contains %d nodes\n", nbNodes);
1153360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    switch (op->value2) {
11534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_NONE:
11535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for none !!!\n");
11537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_TYPE:
11539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
1154060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                            "           searching for type %d\n", op->value3);
11541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_PI:
11543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for PI !!!\n");
11545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_ALL:
11547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for *\n");
11549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_NS:
11551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for namespace %s\n",
1155360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                            op->value5);
11554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_NAME:
11556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
1155760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                            "           searching for name %s\n", op->value5);
1155860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            if (op->value4)
11559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext,
1156060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                                "           with namespace %s\n", op->value4);
11561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Testing : ");
11564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* DEBUG_STEP */
11566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt,
11569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
11570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlNodeSetPtr set,
11571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int contextSize,
11572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int hasNsNodes)
11573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1) {
11575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompExprPtr comp = ctxt->comp;
11576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Process inner predicates first.
11578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) {
11580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: raise an internal error.
11582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	contextSize = xmlXPathCompOpEvalPredicate(ctxt,
11585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &comp->steps[op->ch1], set, contextSize, hasNsNodes);
11586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR0;
11587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextSize <= 0)
11588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
1158960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1) {
11591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextPtr xpctxt = ctxt->context;
11592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr contextNode, oldContextNode;
11593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDocPtr oldContextDoc;
11594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, res, contextPos = 0, newContextSize;
11595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathStepOpPtr exprOp;
11596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr contextObj = NULL, exprRes = NULL;
11597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: Check the following:
11601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  We don't expect location sets if evaluating prediates, right?
11602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  Only filters should expect location sets, right?
11603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC XPath 1.0:
11607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  "For each node in the node-set to be filtered, the
11608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  PredicateExpr is evaluated with that node as the
11609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  context node, with the number of nodes in the
11610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  node-set as the context size, and with the proximity
11611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  position of the node in the node-set with respect to
11612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  the axis as the context position;"
11613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* @oldset is the node-set" to be filtered.
11614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC XPath 1.0:
11616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  "only predicates change the context position and
11617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  context size (see [2.4 Predicates])."
11618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Example:
11619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   node-set  context pos
11620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nA         1
11621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nB         2
11622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nC         3
11623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   After applying predicate [position() > 1] :
11624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   node-set  context pos
11625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nB         1
11626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nC         2
11627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextNode = xpctxt->node;
11629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextDoc = xpctxt->doc;
11630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the expression of this predicate.
11632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1163360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	exprOp = &ctxt->comp->steps[op->ch2];
11634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newContextSize = 0;
11635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < set->nodeNr; i++) {
11636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set->nodeTab[i] == NULL)
11637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
11638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    contextNode = set->nodeTab[i];
11640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextNode;
11641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->contextSize = contextSize;
11642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->proximityPosition = ++contextPos;
1164360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1164460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
11645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Also set the xpath document in case things like
11646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * key() are evaluated in the predicate.
11647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((contextNode->type != XML_NAMESPACE_DECL) &&
11649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(contextNode->doc != NULL))
11650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xpctxt->doc = contextNode->doc;
11651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate the predicate expression with 1 context node
11653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * at a time; this node is packaged into a node set; this
11654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * node set is handed over to the evaluation mechanism.
11655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextObj == NULL)
11657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode);
11658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
11659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(contextObj->nodesetval,
11660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    contextNode);
11661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, contextObj);
11663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1);
11665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) {
11667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(set, hasNsNodes);
11668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newContextSize = 0;
11669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto evaluation_exit;
11670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 0) {
11673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newContextSize++;
11674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Remove the entry from the initial node set.
11677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set->nodeTab[i] = NULL;
11679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (contextNode->type == XML_NAMESPACE_DECL)
11680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode);
11681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj) {
11683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't free the temporary XPath object holding the
11685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* context node, in order to avoid massive recreation
11686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* inside this loop.
11687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes);
11690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: The object was lost in the evaluation machinery.
11693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  Can this happen? Maybe in internal-error cases.
11694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = NULL;
11696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextObj != NULL) {
11700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj)
11701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(xpctxt, contextObj);
1170360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
11704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit:
11705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exprRes != NULL)
11706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, exprRes);
11707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Reset/invalidate the context.
11709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->node = oldContextNode;
11711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->doc = oldContextDoc;
11712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->contextSize = -1;
11713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->proximityPosition = -1;
11714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(newContextSize);
11715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(contextSize);
11717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt,
11721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlXPathStepOpPtr op,
11722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlNodeSetPtr set,
11723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int contextSize,
11724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int minPos,
11725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int maxPos,
11726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int hasNsNodes)
11727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1) {
11729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompExprPtr comp = ctxt->comp;
11730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) {
11731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: raise an internal error.
11733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	contextSize = xmlXPathCompOpEvalPredicate(ctxt,
11736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &comp->steps[op->ch1], set, contextSize, hasNsNodes);
11737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR0;
11738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextSize <= 0)
11739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
11740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check if the node set contains a sufficient number of nodes for
11743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the requested range.
11744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (contextSize < minPos) {
11746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetClear(set, hasNsNodes);
11747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
11748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 == -1) {
11750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Can this ever happen?
11752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (contextSize);
11754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDocPtr oldContextDoc;
11756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, pos = 0, newContextSize = 0, contextPos = 0, res;
11757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathStepOpPtr exprOp;
11758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr contextObj = NULL, exprRes = NULL;
11759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr oldContextNode, contextNode = NULL;
11760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextPtr xpctxt = ctxt->context;
11761df143a5041f03a22808b59c76698770b74692815Selim Gurun        int frame;
11762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * URGENT TODO: Check the following:
11766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  We don't expect location sets if evaluating prediates, right?
11767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Only filters should expect location sets, right?
11768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
11770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Save old context.
11773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextNode = xpctxt->node;
11775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextDoc = xpctxt->doc;
11776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the expression of this predicate.
11778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exprOp = &ctxt->comp->steps[op->ch2];
11780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < set->nodeNr; i++) {
11781df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlXPathObjectPtr tmp;
11782df143a5041f03a22808b59c76698770b74692815Selim Gurun
11783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set->nodeTab[i] == NULL)
11784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
11785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    contextNode = set->nodeTab[i];
11787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextNode;
11788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->contextSize = contextSize;
11789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->proximityPosition = ++contextPos;
1179060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
11791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Initialize the new set.
11793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Also set the xpath document in case things like
11794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * key() evaluation are attempted on the predicate
11795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((contextNode->type != XML_NAMESPACE_DECL) &&
11797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(contextNode->doc != NULL))
11798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xpctxt->doc = contextNode->doc;
11799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate the predicate expression with 1 context node
11801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * at a time; this node is packaged into a node set; this
11802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * node set is handed over to the evaluation mechanism.
11803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextObj == NULL)
11805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode);
11806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
11807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(contextObj->nodesetval,
11808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    contextNode);
11809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11810df143a5041f03a22808b59c76698770b74692815Selim Gurun            frame = xmlXPathSetFrame(ctxt);
11811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, contextObj);
11812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1);
11813df143a5041f03a22808b59c76698770b74692815Selim Gurun            tmp = valuePop(ctxt);
11814df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlXPathPopFrame(ctxt, frame);
1181560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
11816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) {
11817df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (tmp != contextObj) {
11818df143a5041f03a22808b59c76698770b74692815Selim Gurun                    /*
11819df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * Free up the result
11820df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * then pop off contextObj, which will be freed later
11821df143a5041f03a22808b59c76698770b74692815Selim Gurun                     */
11822df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlXPathReleaseObject(xpctxt, tmp);
11823df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp = valuePop(ctxt);
11824df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
11825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto evaluation_error;
11826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11827df143a5041f03a22808b59c76698770b74692815Selim Gurun            /* push the result back onto the stack */
11828df143a5041f03a22808b59c76698770b74692815Selim Gurun            valuePush(ctxt, tmp);
11829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res)
11831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pos++;
11832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res && (pos >= minPos) && (pos <= maxPos)) {
11834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Fits in the requested range.
11836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newContextSize++;
11838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (minPos == maxPos) {
11839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
11840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Only 1 node was requested.
11841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
11842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (contextNode->type == XML_NAMESPACE_DECL) {
11843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
11844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* As always: take care of those nasty
11845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* namespace nodes.
11846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
11847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set->nodeTab[i] = NULL;
11848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
11849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetClear(set, hasNsNodes);
11850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeNr = 1;
1185160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    set->nodeTab[0] = contextNode;
11852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto evaluation_exit;
1185360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
11854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pos == maxPos) {
11855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
11856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * We are done.
11857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
11858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes);
11859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto evaluation_exit;
11860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Remove the entry from the initial node set.
11864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set->nodeTab[i] = NULL;
11866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (contextNode->type == XML_NAMESPACE_DECL)
11867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode);
11868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exprRes != NULL) {
11870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, exprRes);
11871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exprRes = NULL;
11872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj) {
11874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't free the temporary XPath object holding the
11876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* context node, in order to avoid massive recreation
11877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* inside this loop.
11878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes);
11881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The object was lost in the evaluation machinery.
11884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Can this happen? Maybe in case of internal-errors.
11885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = NULL;
11887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto evaluation_exit;
11890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_error:
11892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetClear(set, hasNsNodes);
11893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newContextSize = 0;
11894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit:
11896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextObj != NULL) {
11897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj)
11898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(xpctxt, contextObj);
11900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exprRes != NULL)
11902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, exprRes);
11903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Reset/invalidate the context.
11905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->node = oldContextNode;
11907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->doc = oldContextDoc;
11908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->contextSize = -1;
11909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->proximityPosition = -1;
11910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(newContextSize);
11911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(contextSize);
11913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt,
1191760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    xmlXPathStepOpPtr op,
11918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int *maxPos)
11919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOpPtr exprOp;
11922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * BIG NOTE: This is not intended for XPATH_OP_FILTER yet!
11925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1192660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
11927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If not -1, then ch1 will point to:
11929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1) For predicates (XPATH_OP_PREDICATE):
11930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    - an inner predicate operator
11931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2) For filters (XPATH_OP_FILTER):
11932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    - an inner filter operater OR
11933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    - an expression selecting the node set.
11934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *      E.g. "key('a', 'b')" or "(//foo | //bar)".
1193560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
11936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER))
11937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
11938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1) {
11940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exprOp = &ctxt->comp->steps[op->ch2];
1194160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
11942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
11943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exprOp != NULL) &&
11945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(exprOp->op == XPATH_OP_VALUE) &&
11946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(exprOp->value4 != NULL) &&
11947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER))
11948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
11949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We have a "[n]" predicate here.
11951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Unfortunately this simplistic test here is not
11952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* able to detect a position() predicate in compound
11953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* expressions like "[@attr = 'a" and position() = 1],
11954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and even not the usage of position() in
11955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "[position() = 1]"; thus - obviously - a position-range,
11956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* like it "[position() < 5]", is also not detected.
11957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Maybe we could rewrite the AST to ease the optimization.
11958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval;
1196060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
11961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((xmlXPathObjectPtr) exprOp->value4)->floatval ==
11962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (float) *maxPos)
1196360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	{
11964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
11965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
11972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlXPathStepOpPtr op,
11973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr * first, xmlNodePtr * last,
11974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   int toBool)
11975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT \
11978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasAxisRange != 0) { \
11979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (++pos == maxPos) { \
11980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    addNode(seq, cur); \
11981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto axis_range_end; } \
11982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else { \
11983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	addNode(seq, cur); \
11984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (breakOnFirstHit) goto first_hit; }
11985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT_NS \
11987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasAxisRange != 0) { \
11988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (++pos == maxPos) { \
11989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    hasNsNodes = 1; \
11990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur); \
11991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto axis_range_end; } \
11992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else { \
11993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hasNsNodes = 1; \
11994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetAddNs(seq, \
11995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->node, (xmlNsPtr) cur); \
11996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (breakOnFirstHit) goto first_hit; }
11997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value;
11999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTestVal test = (xmlXPathTestVal) op->value2;
12000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3;
12001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *prefix = op->value4;
12002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = op->value5;
12003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *URI = NULL;
12004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbMatches = 0, prevMatches = 0;
12007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0, hasNsNodes = 0;
12009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The popped object holding the context nodes */
12010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
12011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The set of context nodes for the node tests */
12012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr contextSeq;
12013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int contextIdx;
12014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr contextNode;
12015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The context node for a compound traversal */
12016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr outerContextNode;
12017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The final resulting node set wrt to all context nodes */
12018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr outSeq;
12019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The temporary resulting node set wrt 1 context node.
12021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Used to feed predicate evaluation.
12022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr seq;
1202460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlNodePtr cur;
12025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* First predicate operator */
12026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOpPtr predOp;
12027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxPos; /* The requested position() (when a "[n]" predicate) */
12028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasPredicateRange, hasAxisRange, pos, size, newSize;
12029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int breakOnFirstHit;
12030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTraversalFunction next = NULL;
12032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* compound axis traversal */
12033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTraversalFunctionExt outerNext = NULL;
12034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void (*addNode) (xmlNodeSetPtr, xmlNodePtr);
12035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetMergeFunction mergeAndClear;
1203660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlNodePtr oldContextNode;
12037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextPtr xpctxt = ctxt->context;
12038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE0(XPATH_NODESET);
12041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
12042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Setup namespaces.
12044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix != NULL) {
12046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        URI = xmlXPathNsLookup(xpctxt, prefix);
12047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (URI == NULL) {
12048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(xpctxt, obj);
12049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
12050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1205160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
12052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Setup axis.
12054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
12055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * MAYBE FUTURE TODO: merging optimizations:
12056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * - If the nodes to be traversed wrt to the initial nodes and
12057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   the current axis cannot overlap, then we could avoid searching
12058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   for duplicates during the merge.
12059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   But the question is how/when to evaluate if they cannot overlap.
12060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   Example: if we know that for two initial nodes, the one is
12061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   not in the ancestor-or-self axis of the other, then we could safely
12062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   avoid a duplicate-aware merge, if the axis to be traversed is e.g.
12063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   the descendant-or-self axis.
12064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mergeAndClear = xmlXPathNodeSetMergeAndClear;
12066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (axis) {
12067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR:
12068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextAncestor;
12070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR_OR_SELF:
12072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextAncestorOrSelf;
12074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ATTRIBUTE:
12076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextAttribute;
12079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_CHILD:
12082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->rewriteType == XP_REWRITE_DOS_CHILD_ELEM) {
12084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This iterator will give us only nodes which can
12086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* hold element nodes.
12087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
1208860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		outerNext = xmlXPathNextDescendantOrSelfElemParent;
1208960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
12090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) &&
12091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(type == NODE_TYPE_NODE))
12092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
12093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Optimization if an element node type is 'element'.
12095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		next = xmlXPathNextChildElement;
12097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
12098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		next = xmlXPathNextChild;
12099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT:
12102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextDescendant;
12104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT_OR_SELF:
12106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextDescendantOrSelf;
12108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING:
12110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextFollowing;
12112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING_SIBLING:
12114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextFollowingSibling;
12116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_NAMESPACE:
12118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = (xmlXPathTraversalFunction) xmlXPathNextNamespace;
12121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PARENT:
12124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextParent;
12126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING:
12128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextPrecedingInternal;
12130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING_SIBLING:
12132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextPrecedingSibling;
12134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_SELF:
12136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextSelf;
12139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
1214460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathDebugDumpStepAxis(op,
1214560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	(obj->nodesetval != NULL) ? obj->nodesetval->nodeNr : 0);
12146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (next == NULL) {
1214960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlXPathReleaseObject(xpctxt, obj);
12150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
1215160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
12152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    contextSeq = obj->nodesetval;
12153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) {
12154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(xpctxt, obj);
12155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL));
12156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
1215760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
12158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Predicate optimization ---------------------------------------------
12160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If this step has a last predicate, which contains a position(),
12161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then we'll optimize (although not exactly "position()", but only
12162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the  short-hand form, i.e., "[n]".
12163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
12164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Example - expression "/foo[parent::bar][1]":
1216560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    *
12166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * COLLECT 'child' 'name' 'node' foo    -- op (we are here)
12167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   ROOT                               -- op->ch1
12168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   PREDICATE                          -- op->ch2 (predOp)
12169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *     PREDICATE                          -- predOp->ch1 = [parent::bar]
12170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *       SORT
12171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *         COLLECT  'parent' 'name' 'node' bar
12172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *           NODE
12173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *     ELEM Object is a number : 1        -- predOp->ch2 = [1]
12174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
12175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    maxPos = 0;
12177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    predOp = NULL;
12178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hasPredicateRange = 0;
12179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hasAxisRange = 0;
12180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1) {
12181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* There's at least one predicate. 16 == XPATH_OP_PREDICATE
12183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	predOp = &ctxt->comp->steps[op->ch2];
12185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) {
12186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (predOp->ch1 != -1) {
12187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Use the next inner predicate operator.
12189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		predOp = &ctxt->comp->steps[predOp->ch1];
12191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hasPredicateRange = 1;
12192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* There's no other predicate than the [n] predicate.
12195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		predOp = NULL;
12197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hasAxisRange = 1;
1219860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
12199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0;
12202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Axis traversal -----------------------------------------------------
12204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 2.3 Node Tests
1220760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     *  - For the attribute axis, the principal node type is attribute.
12208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *  - For the namespace axis, the principal node type is namespace.
12209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *  - For other axes, the principal node type is element.
12210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
12211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * A node test * is true for any node of the
12212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * principal node type. For example, child::* will
12213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * select all element children of the context node
12214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
12215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldContextNode = xpctxt->node;
12216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    addNode = xmlXPathNodeSetAddUnique;
12217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outSeq = NULL;
12218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    seq = NULL;
12219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outerContextNode = NULL;
12220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    contextNode = NULL;
12221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    contextIdx = 0;
12222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) {
12225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (outerNext != NULL) {
12226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is a compound traversal.
12228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextNode == NULL) {
12230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Set the context for the outer traversal.
12232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		outerContextNode = contextSeq->nodeTab[contextIdx++];
12234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextNode = outerNext(NULL, outerContextNode);
12235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
12236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextNode = outerNext(contextNode, outerContextNode);
12237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextNode == NULL)
12238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
12239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Set the context for the main traversal.
12241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextNode;
12243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
1224460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xpctxt->node = contextSeq->nodeTab[contextIdx++];
1224560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (seq == NULL) {
12247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    seq = xmlXPathNodeSetCreate(NULL);
12248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (seq == NULL) {
12249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total = 0;
12250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;
12251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Traverse the axis and test the nodes.
12255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pos = 0;
12257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = NULL;
12258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hasNsNodes = 0;
12259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
12260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = next(ctxt, cur);
12261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
12262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
12263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * QUESTION TODO: What does the "first" and "last" stuff do?
12266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((first != NULL) && (*first != NULL)) {
12268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*first == cur)
12269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((total % 256) == 0) &&
12271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
12272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodesExt(*first, cur) >= 0))
12273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
12274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodes(*first, cur) >= 0))
12275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
12277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((last != NULL) && (*last != NULL)) {
12281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*last == cur)
12282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((total % 256) == 0) &&
12284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
12285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodesExt(cur, *last) >= 0))
12286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
12287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodes(cur, *last) >= 0))
12288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
12290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total++;
12295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, " %s", cur->name);
12298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1229960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (test) {
12301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NONE:
12302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    total = 0;
12303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    STRANGE
12304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
12305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_TYPE:
12306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Don't we need to use
12308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  xmlXPathNodeSetAddNs() for namespace nodes here?
12309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  Surprisingly, some c14n tests fail, if we do this.
12310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type == NODE_TYPE_NODE) {
12312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			switch (cur->type) {
12313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_DOCUMENT_NODE:
12314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_HTML_DOCUMENT_NODE:
12315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
12316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_DOCB_DOCUMENT_NODE:
12317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1231860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    case XML_ELEMENT_NODE:
12319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_ATTRIBUTE_NODE:
12320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_PI_NODE:
12321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_COMMENT_NODE:
12322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_CDATA_SECTION_NODE:
12323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_TEXT_NODE:
12324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_NAMESPACE_DECL:
12325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XP_TEST_HIT
12326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
12327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    default:
12328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
12329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
12330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (cur->type == type) {
12331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (type == XML_NAMESPACE_DECL)
12332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT_NS
12333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
12334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT
12335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((type == NODE_TYPE_TEXT) &&
12336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 (cur->type == XML_CDATA_SECTION_NODE))
12337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
12338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_TEST_HIT
12339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
12340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_PI:
12342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((cur->type == XML_PI_NODE) &&
12343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ((name == NULL) || xmlStrEqual(name, cur->name)))
12344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
12345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_TEST_HIT
12346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
12348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_ALL:
12349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (axis == AXIS_ATTRIBUTE) {
12350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type == XML_ATTRIBUTE_NODE)
12351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
12352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT
12353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (axis == AXIS_NAMESPACE) {
12355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type == XML_NAMESPACE_DECL)
12356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
12357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT_NS
12358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
12360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type == XML_ELEMENT_NODE) {
12361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (prefix == NULL)
12362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    {
12363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XP_TEST_HIT
12364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else if ((cur->ns != NULL) &&
12366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(xmlStrEqual(URI, cur->ns->href)))
12367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    {
12368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XP_TEST_HIT
12369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
12373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NS:{
12374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        TODO;
12375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
12376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NAME:
12378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (axis == AXIS_ATTRIBUTE) {
12379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type != XML_ATTRIBUTE_NODE)
12380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
12381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (axis == AXIS_NAMESPACE) {
12382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type != XML_NAMESPACE_DECL)
12383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
12384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
12385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (cur->type != XML_ELEMENT_NODE)
12386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
12387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
12388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    switch (cur->type) {
12389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        case XML_ELEMENT_NODE:
12390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (xmlStrEqual(name, cur->name)) {
12391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (prefix == NULL) {
12392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (cur->ns == NULL)
12393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    {
12394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					XP_TEST_HIT
12395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
12396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else {
12397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if ((cur->ns != NULL) &&
12398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        (xmlStrEqual(URI, cur->ns->href)))
12399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    {
12400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					XP_TEST_HIT
12401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
12402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
12403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
12405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        case XML_ATTRIBUTE_NODE:{
12406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlAttrPtr attr = (xmlAttrPtr) cur;
12407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (xmlStrEqual(name, attr->name)) {
12409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (prefix == NULL) {
12410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        if ((attr->ns == NULL) ||
12411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            (attr->ns->prefix == NULL))
12412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					{
12413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    XP_TEST_HIT
12414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        }
12415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    } else {
12416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        if ((attr->ns != NULL) &&
12417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            (xmlStrEqual(URI,
12418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      attr->ns->href)))
12419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					{
12420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    XP_TEST_HIT
12421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        }
12422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
12423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
12424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
12425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        case XML_NAMESPACE_DECL:
12427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (cur->type == XML_NAMESPACE_DECL) {
12428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlNsPtr ns = (xmlNsPtr) cur;
12429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if ((ns->prefix != NULL) && (name != NULL)
12431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    && (xmlStrEqual(ns->prefix, name)))
12432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				{
12433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    XP_TEST_HIT_NS
12434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
12435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
12437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        default:
12438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
12439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
12441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } /* switch(test) */
12442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
12443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto apply_predicates;
12445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1244660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottaxis_range_end: /* ----------------------------------------------------- */
12447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We have a "/foo[n]", and position() = n was reached.
12449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we can have as well "/foo/::parent::foo[1]", so
12450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* a duplicate-aware merge is still needed.
12451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Merge with the result.
12452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (outSeq == NULL) {
12454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = seq;
12455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    seq = NULL;
12456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
12457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = mergeAndClear(outSeq, seq, 0);
12458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Break if only a true/false result was requested.
12460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (toBool)
12462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
12463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	continue;
12464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfirst_hit: /* ---------------------------------------------------------- */
12466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Break if only a true/false result was requested and
12468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* no predicates existed and a node test succeeded.
12469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (outSeq == NULL) {
12471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = seq;
12472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    seq = NULL;
12473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
12474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = mergeAndClear(outSeq, seq, 0);
12475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
12476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (seq != NULL)
12479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbMatches += seq->nodeNr;
12480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectapply_predicates: /* --------------------------------------------------- */
12483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
12484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply predicates.
1248560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
12486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((predOp != NULL) && (seq->nodeNr > 0)) {
12487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * E.g. when we have a "/foo[some expression][n]".
1248960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
12490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * QUESTION TODO: The old predicate evaluation took into
12492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  account location-sets.
12493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  (E.g. ctxt->value->type == XPATH_LOCATIONSET)
12494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Do we expect such a set here?
12495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  All what I learned now from the evaluation semantics
12496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  does not indicate that a location-set will be processed
12497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  here, so this looks OK.
1249860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
12499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Iterate over all predicates, starting with the outermost
12501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * predicate.
12502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Problem: we cannot execute the inner predicates first
12503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  since we cannot go back *up* the operator tree!
12504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Options we have:
12505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  1) Use of recursive functions (like is it currently done
12506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *     via xmlXPathCompOpEval())
12507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  2) Add a predicate evaluation information stack to the
12508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *     context struct
12509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  3) Change the way the operators are linked; we need a
12510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *     "parent" field on xmlXPathStepOp
12511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
12512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * For the moment, I'll try to solve this with a recursive
12513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * function: xmlXPathCompOpEvalPredicate().
1251460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
12515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    size = seq->nodeNr;
12516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (hasPredicateRange != 0)
12517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt,
12518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    predOp, seq, size, maxPos, maxPos, hasNsNodes);
12519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
12520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newSize = xmlXPathCompOpEvalPredicate(ctxt,
12521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    predOp, seq, size, hasNsNodes);
12522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK) {
12524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total = 0;
12525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;
12526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add the filtered set of nodes to the result node set.
12529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (newSize == 0) {
12531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The predicates filtered all nodes out.
12533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(seq, hasNsNodes);
12535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (seq->nodeNr > 0) {
12536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Add to result set.
12538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (outSeq == NULL) {
12540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (size != newSize) {
12541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
12542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* We need to merge and clear here, since
12543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the sequence will contained NULLed entries.
12544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
12545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			outSeq = mergeAndClear(NULL, seq, 1);
12546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
12547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			outSeq = seq;
12548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			seq = NULL;
12549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
12550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
12551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    outSeq = mergeAndClear(outSeq, seq,
12552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(size != newSize) ? 1: 0);
12553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Break if only a true/false result was requested.
12555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (toBool)
12557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (seq->nodeNr > 0) {
12560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add to result set.
12562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (outSeq == NULL) {
12564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		outSeq = seq;
12565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		seq = NULL;
12566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		outSeq = mergeAndClear(outSeq, seq, 0);
12568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1256960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
12570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
12573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj->boolval) && (obj->user != NULL)) {
12574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* QUESTION TODO: What does this do and why?
12576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Do we have to do this also for the "error"
12577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cleanup further down?
12578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->boolval = 1;
12580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->user = obj->user;
12581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj->user = NULL;
12582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj->boolval = 0;
12583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(xpctxt, obj);
12585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Ensure we return at least an emtpy set.
12588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (outSeq == NULL) {
12590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((seq != NULL) && (seq->nodeNr == 0))
12591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = seq;
12592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
12593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = xmlXPathNodeSetCreate(NULL);
1259460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        /* XXX what if xmlXPathNodeSetCreate returned NULL here? */
12595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((seq != NULL) && (seq != outSeq)) {
12597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlXPathFreeNodeSet(seq);
1259860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
12599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Hand over the result. Better to push the set also in
12601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * case of errors.
12602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq));
12604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reset the context node.
12606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xpctxt->node = oldContextNode;
12608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
12611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"\nExamined %d nodes, found %d nodes at that step\n",
12612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	total, nbMatches);
12613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(total);
12616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
12620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathStepOpPtr op, xmlNodePtr * first);
12621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalFirst:
12624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
12625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an XPath compiled operation
12626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @first:  the first elem found so far
12627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the first
12629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order
12630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of examined objects.
12632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
12635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathStepOpPtr op, xmlNodePtr * first)
12636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0, cur;
12638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
12639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
12640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
12643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
12644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
12645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
12647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total =
12648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1],
12649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        first);
12650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval->nodeNr >= 1)) {
12655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
12656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * limit tree traversing to first node in the result
12657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
12658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* OPTIMIZE TODO: This implicitely sorts
12660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  the result, even if not needed. E.g. if the argument
12661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  of the count() function, no sorting is needed.
12662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* OPTIMIZE TODO: How do we know if the node-list wasn't
12663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  aready sorted?
12664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->value->nodesetval->nodeNr > 1)
12666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetSort(ctxt->value->nodesetval);
12667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *first = ctxt->value->nodesetval->nodeTab[0];
12668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur =
12670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2],
12671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        first);
12672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
12675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
12678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
12680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    arg2->nodesetval);
12681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
12682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
12683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* optimizer */
12684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (total > cur)
12685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompSwap(op);
12686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total + cur);
12687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
12688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathRoot(ctxt);
12689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
12691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node));
12699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
12701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->context->node = NULL;
12708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT:{
12710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 == -1)
12711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
12712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
12715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0);
12717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
12718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VALUE:
12720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt,
12721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlXPathCacheObjectCopy(ctxt->context,
12722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlXPathObjectPtr) op->value4));
12723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
12725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total +=
12727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1],
12728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            first);
12729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&& (ctxt->value->nodesetval->nodeNr > 1))
12734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathNodeSetSort(ctxt->value->nodesetval);
12735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST
12737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_FILTER:
12738df143a5041f03a22808b59c76698770b74692815Selim Gurun                total += xmlXPathCompOpEvalFilterFirst(ctxt, op, first);
12739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
12742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlXPathCompOpEval(ctxt, op));
12743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalLast:
12748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
12749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an XPath compiled operation
12750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @last:  the last elem found so far
12751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the last
12753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order
12754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed
12756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op,
12759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr * last)
12760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0, cur;
12762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
12763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
12764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr bak;
12765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr bakd;
12766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pp;
12767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cs;
12768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
12771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
12772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
12773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
12775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
12776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
12777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
12778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
12779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total =
12780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last);
12781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval->nodeNr >= 1)) {
12786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
12787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * limit tree traversing to first node in the result
12788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
12789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->value->nodesetval->nodeNr > 1)
12790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetSort(ctxt->value->nodesetval);
12791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *last =
12792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->value->nodesetval->nodeTab[ctxt->value->
12793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     nodesetval->nodeNr -
12794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     1];
12795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
12797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
12798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
12799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
12800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur =
12801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last);
12802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */
12807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
12810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
12813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
12815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    arg2->nodesetval);
12816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
12817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
12818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* optimizer */
12819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (total > cur)
12820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompSwap(op);
12821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total + cur);
12822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
12823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathRoot(ctxt);
12824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
12826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node));
12834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
12836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->context->node = NULL;
12843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT:{
12845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 == -1)
12846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (0);
12847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
12850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0);
12852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
12853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VALUE:
12855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt,
12856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlXPathCacheObjectCopy(ctxt->context,
12857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlXPathObjectPtr) op->value4));
12858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
12860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total +=
12862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1],
12863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           last);
12864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&& (ctxt->value->nodesetval->nodeNr > 1))
12869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathNodeSetSort(ctxt->value->nodesetval);
12870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
12872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlXPathCompOpEval(ctxt, op));
12873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST
12877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
12879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathStepOpPtr op, xmlNodePtr * first)
12880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0;
1288260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathCompExprPtr comp;
12883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res;
1288460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathObjectPtr obj;
12885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr oldset;
12886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr oldnode;
12887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr oldDoc;
12888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
12889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
12892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Optimization for ()[last()] selection i.e. the last elem
12894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((op->ch1 != -1) && (op->ch2 != -1) &&
12896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(comp->steps[op->ch1].op == XPATH_OP_SORT) &&
12897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(comp->steps[op->ch2].op == XPATH_OP_SORT)) {
12898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int f = comp->steps[op->ch2].ch1;
1289960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((f != -1) &&
12901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].op == XPATH_OP_FUNCTION) &&
12902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value5 == NULL) &&
12903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value == 0) &&
12904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value4 != NULL) &&
12905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrEqual
12906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value4, BAD_CAST "last"))) {
12907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr last = NULL;
1290860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    total +=
12910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompOpEvalLast(ctxt,
12911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &comp->steps[op->ch1],
12912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &last);
12913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The nodeset should be in document order,
12916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Keep only the last value
12917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->value != NULL) &&
12919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->type == XPATH_NODESET) &&
12920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval != NULL) &&
12921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval->nodeTab != NULL) &&
12922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval->nodeNr > 1)) {
12923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->value->nodesetval->nodeTab[0] =
12924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->value->nodesetval->nodeTab[ctxt->
12925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value->
12926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nodesetval->
12927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nodeNr -
12928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    1];
12929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->value->nodesetval->nodeNr = 1;
12930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*first = *(ctxt->value->nodesetval->nodeTab);
12931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (total);
12933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1293560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1)
12937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 == -1)
12940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (total);
12941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL)
12942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (total);
1294360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
12945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldnode = ctxt->context->node;
12946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Hum are we filtering the result of an XPointer expression
12948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value->type == XPATH_LOCATIONSET) {
12950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp = NULL;
12951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlLocationSetPtr newlocset = NULL;
12952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlLocationSetPtr oldlocset;
1295360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Extract the old locset, and then evaluate the result of the
12956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* expression for all the element in the locset. use it to grow
12957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* up a new locset.
12958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_TYPE0(XPATH_LOCATIONSET);
12960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj = valuePop(ctxt);
12961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldlocset = obj->user;
12962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
1296360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((oldlocset == NULL) || (oldlocset->locNr == 0)) {
12965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = 0;
12966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = 0;
12967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
12968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
12970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL) {
12971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, res);
12972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, obj);
12974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (total);
12976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newlocset = xmlXPtrLocationSetCreate(NULL);
1297860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
12979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < oldlocset->locNr; i++) {
12980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Run the evaluation with a node list made of a
12982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * single item in the nodelocset.
12983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = oldlocset->locTab[i]->user;
12985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = oldlocset->locNr;
12986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = i + 1;
12987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL) {
12988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlXPathCacheNewNodeSet(ctxt->context,
12989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
12990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(tmp->nodesetval,
12992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
1299360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
12994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, tmp);
12995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
12996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK) {
12998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(obj);
12999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The result of the evaluation need to be tested to
13003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * decided whether the filter succeeded or not
13004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
13006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPtrLocationSetAdd(newlocset,
13008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCacheObjectCopy(ctxt->context,
13009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			oldlocset->locTab[i]));
13010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Cleanup
13013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL) {
13015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, res);
13016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == tmp) {
13018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
1301960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlXPathNodeSetClear(tmp->nodesetval, 1);
13020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* REVISIT TODO: Don't create a temporary nodeset
13022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* for everly iteration.
13023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* OLD: xmlXPathFreeObject(res); */
13025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
1302660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		tmp = NULL;
13027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = NULL;
13028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Only put the first node in the result, then leave.
13030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (newlocset->locNr > 0) {
13032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*first = (xmlNodePtr) oldlocset->locTab[i]->user;
13033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
13037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, tmp);
13038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The result is used as the new evaluation locset.
13041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, obj);
13043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
13044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = -1;
13045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = -1;
13046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
13047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = oldnode;
13048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (total);
13049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
1305160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
13052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract the old set, and then evaluate the result of the
13054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * expression for all the element in the set. use it to grow
13055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * up a new set.
13056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE0(XPATH_NODESET);
13058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
13059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = obj->nodesetval;
1306060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
13061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldnode = ctxt->context->node;
13062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldDoc = ctxt->context->doc;
13063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = NULL;
1306460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
13065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((oldset == NULL) || (oldset->nodeNr == 0)) {
13066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = 0;
13067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = 0;
13068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* QUESTION TODO: Why was this code commented out?
13069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
13070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total +=
13071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCompOpEval(ctxt,
13072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&comp->steps[op->ch2]);
13073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
13075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL)
13076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(res);
13077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, obj);
13079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = oldnode;
13080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR0;
13081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
13082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodeSetPtr newset;
13083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp = NULL;
13084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Initialize the new set.
13086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Also set the xpath document in case things like
13087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* key() evaluation are attempted on the predicate
1308860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
13089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newset = xmlXPathNodeSetCreate(NULL);
1309060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        /* XXX what if xmlXPathNodeSetCreate returned NULL? */
1309160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
13092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < oldset->nodeNr; i++) {
13093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Run the evaluation with a node list made of
13095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * a single item in the nodeset.
13096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = oldset->nodeTab[i];
13098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) &&
13099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(oldset->nodeTab[i]->doc != NULL))
13100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->doc = oldset->nodeTab[i]->doc;
13101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL) {
13102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
13104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
13105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(tmp->nodesetval,
13106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
13107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, tmp);
13109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = oldset->nodeNr;
13110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = i + 1;
13111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
13112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK) {
13114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeNodeSet(newset);
13115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(obj);
13116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
1311760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
13118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The result of the evaluation needs to be tested to
13120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * decide whether the filter succeeded or not
13121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
13123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]);
1312560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
13126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Cleanup
13128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL) {
13130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, res);
13131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == tmp) {
13133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
13134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't free the temporary nodeset
13136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* in order to avoid massive recreation inside this
13137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* loop.
13138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(tmp->nodesetval, 1);
13140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
13141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = NULL;
13142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = NULL;
13143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Only put the first node in the result, then leave.
13145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (newset->nodeNr > 0) {
13147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*first = *(newset->nodeTab);
13148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
13152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, tmp);
13153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The result is used as the new evaluation set.
13156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, obj);
13158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
13159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = -1;
13160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = -1;
13161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* may want to move this past the '}' later */
13162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->doc = oldDoc;
13163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset));
13164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = oldnode;
13166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(total);
13167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_FILTER_FIRST */
13169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEval:
13172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
13173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an XPath compiled operation
13174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation
13176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed
13177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op)
13180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0;
13182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int equal, ret;
13183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
13184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
13185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr bak;
13186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr bakd;
13187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pp;
13188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cs;
13189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
13191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
13192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
13193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
13194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
13195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_AND:
13196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value == NULL) || (ctxt->value->boolval == 0))
13204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
13206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error) {
13212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(arg2);
13213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
13217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->boolval &= arg2->boolval;
13218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
13219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
13220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_OR:
13222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value == NULL) || (ctxt->value->boolval == 1))
13230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
13232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error) {
13238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(arg2);
13239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
13243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->boolval |= arg2->boolval;
13244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
13245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
13246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_EQUAL:
13248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value)
1326160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		equal = xmlXPathEqualValues(ctxt);
13262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
13263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		equal = xmlXPathNotEqualValues(ctxt);
13264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal));
13265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_CMP:
13267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlXPathCompareValues(ctxt, op->value, op->value2);
13280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret));
13281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PLUS:
13283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1) {
13290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->doc = bakd;
13291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node = bak;
13292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->proximityPosition = pp;
13293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->contextSize = cs;
13294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->value == 0)
13298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathSubValues(ctxt);
13299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 1)
13300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathAddValues(ctxt);
13301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 2)
13302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathValueFlipSign(ctxt);
13303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 3) {
13304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                CAST_TO_NUMBER;
13305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                CHECK_TYPE0(XPATH_NUMBER);
13306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_MULT:
13309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->value == 0)
13322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathMultValues(ctxt);
13323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 1)
13324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathDivValues(ctxt);
13325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 2)
13326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathModValues(ctxt);
13327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
13329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
13342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
13343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
13345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
13346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1->nodesetval == NULL) ||
13348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((arg2->nodesetval != NULL) &&
13349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (arg2->nodesetval->nodeNr != 0)))
13350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
13351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
13352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project							arg2->nodesetval);
13353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
13356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
13357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
13359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathRoot(ctxt);
13360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
13362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
13366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
13369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node));
13370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
13372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
13376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->context->node = NULL;
13379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT:{
13381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 == -1)
13382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
13386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0);
13388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VALUE:
13391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt,
13392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlXPathCacheObjectCopy(ctxt->context,
13393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlXPathObjectPtr) op->value4));
13394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VARIABLE:{
13396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathObjectPtr val;
13397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->value5 == NULL) {
13402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val = xmlXPathVariableLookup(ctxt->context, op->value4);
13403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (val == NULL) {
13404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->error = XPATH_UNDEF_VARIABLE_ERROR;
13405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0);
13406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, val);
13408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
13409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const xmlChar *URI;
13410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    URI = xmlXPathNsLookup(ctxt->context, op->value5);
13412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (URI == NULL) {
13413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGenericError(xmlGenericErrorContext,
1341460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n",
1341560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                                    (char *) op->value4, (char *)op->value5);
13416df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
13417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val = xmlXPathVariableLookupNS(ctxt->context,
13420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                       op->value4, URI);
13421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (val == NULL) {
13422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->error = XPATH_UNDEF_VARIABLE_ERROR;
13423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0);
13424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, val);
13426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_FUNCTION:{
13430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathFunction func;
13431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *oldFunc, *oldFuncURI;
13432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
13433df143a5041f03a22808b59c76698770b74692815Selim Gurun                int frame;
13434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13435df143a5041f03a22808b59c76698770b74692815Selim Gurun                frame = xmlXPathSetFrame(ctxt);
13436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->valueNr < op->value) {
13440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
13441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "xmlXPathCompOpEval: parameter error\n");
13442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->error = XPATH_INVALID_OPERAND;
13443df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlXPathPopFrame(ctxt, frame);
13444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (total);
13445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13446df143a5041f03a22808b59c76698770b74692815Selim Gurun		for (i = 0; i < op->value; i++) {
13447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) {
13448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlGenericError(xmlGenericErrorContext,
13449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"xmlXPathCompOpEval: parameter error\n");
13450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->error = XPATH_INVALID_OPERAND;
13451df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlXPathPopFrame(ctxt, frame);
13452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (total);
13453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13454df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
13455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->cache != NULL)
13456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    XML_CAST_FPTR(func) = op->cache;
13457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else {
13458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const xmlChar *URI = NULL;
13459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (op->value5 == NULL)
13461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        func =
13462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathFunctionLookup(ctxt->context,
13463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   op->value4);
13464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else {
13465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        URI = xmlXPathNsLookup(ctxt->context, op->value5);
13466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (URI == NULL) {
13467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlGenericError(xmlGenericErrorContext,
1346860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n",
1346960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                                    (char *)op->value4, (char *)op->value5);
13470df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlXPathPopFrame(ctxt, frame);
13471df143a5041f03a22808b59c76698770b74692815Selim Gurun                            ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
13472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            return (total);
13473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        func = xmlXPathFunctionLookupNS(ctxt->context,
13475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        op->value4, URI);
13476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (func == NULL) {
13478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGenericError(xmlGenericErrorContext,
1347960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                                "xmlXPathCompOpEval: function %s not found\n",
1348060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                                        (char *)op->value4);
13481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR);
13482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    op->cache = XML_CAST_FPTR(func);
13484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    op->cacheURI = (void *) URI;
13485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldFunc = ctxt->context->function;
13487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldFuncURI = ctxt->context->functionURI;
13488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->function = op->value4;
13489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->functionURI = op->cacheURI;
13490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                func(ctxt, op->value);
13491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->function = oldFunc;
13492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->functionURI = oldFuncURI;
13493df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlXPathPopFrame(ctxt, frame);
13494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ARG:
13497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1) {
13509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->context->doc = bakd;
13511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->context->node = bak;
13512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        CHECK_ERROR0;
13513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PREDICATE:
13516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_FILTER:{
13517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr res;
13518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr obj, tmp;
13519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodeSetPtr newset = NULL;
13520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodeSetPtr oldset;
13521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr oldnode;
13522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDocPtr oldDoc;
13523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int i;
13524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Optimization for ()[1] selection i.e. the first elem
13527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((op->ch1 != -1) && (op->ch2 != -1) &&
13529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST
13530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
13531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * FILTER TODO: Can we assume that the inner processing
13532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  will result in an ordered list if we have an
13533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  XPATH_OP_FILTER?
13534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  What about an additional field or flag on
13535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  xmlXPathObject like @sorted ? This way we wouln'd need
13536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  to assume anything, so it would be more robust and
13537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  easier to optimize.
13538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
13539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */
13540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */
13541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
13542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (comp->steps[op->ch1].op == XPATH_OP_SORT) &&
13543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */
13545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlXPathObjectPtr val;
13546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    val = comp->steps[op->ch2].value4;
13548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((val != NULL) && (val->type == XPATH_NUMBER) &&
13549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (val->floatval == 1.0)) {
13550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr first = NULL;
13551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total +=
13553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathCompOpEvalFirst(ctxt,
13554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    &comp->steps[op->ch1],
13555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    &first);
13556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			CHECK_ERROR0;
13557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The nodeset should be in document order,
13559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Keep only the first value
13560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((ctxt->value != NULL) &&
13562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->type == XPATH_NODESET) &&
13563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval != NULL) &&
13564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval->nodeNr > 1))
13565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->value->nodesetval->nodeNr = 1;
13566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Optimization for ()[last()] selection i.e. the last elem
13571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((op->ch1 != -1) && (op->ch2 != -1) &&
13573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (comp->steps[op->ch1].op == XPATH_OP_SORT) &&
13574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (comp->steps[op->ch2].op == XPATH_OP_SORT)) {
13575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int f = comp->steps[op->ch2].ch1;
13576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((f != -1) &&
13578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].op == XPATH_OP_FUNCTION) &&
13579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].value5 == NULL) &&
13580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].value == 0) &&
13581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].value4 != NULL) &&
13582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlStrEqual
13583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (comp->steps[f].value4, BAD_CAST "last"))) {
13584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr last = NULL;
13585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total +=
13587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathCompOpEvalLast(ctxt,
13588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch1],
13589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &last);
13590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			CHECK_ERROR0;
13591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The nodeset should be in document order,
13593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Keep only the last value
13594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((ctxt->value != NULL) &&
13596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->type == XPATH_NODESET) &&
13597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval != NULL) &&
13598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval->nodeTab != NULL) &&
13599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval->nodeNr > 1)) {
13600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->value->nodesetval->nodeTab[0] =
13601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ctxt->value->nodesetval->nodeTab[ctxt->
13602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 value->
13603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 nodesetval->
13604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 nodeNr -
13605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 1];
13606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->value->nodesetval->nodeNr = 1;
13607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Process inner predicates first.
13613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Example "index[parent::book][1]":
13614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* ...
13615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   PREDICATE   <-- we are here "[1]"
13616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*     PREDICATE <-- process "[parent::book]" first
13617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*       SORT
13618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*         COLLECT  'parent' 'name' 'node' book
13619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*           NODE
13620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*     ELEM Object is a number : 1
13621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
13626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch2 == -1)
13627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->value == NULL)
13629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldnode = ctxt->context->node;
13632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
13634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Hum are we filtering the result of an XPointer expression
13636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->value->type == XPATH_LOCATIONSET) {
13638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlLocationSetPtr newlocset = NULL;
13639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlLocationSetPtr oldlocset;
13640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Extract the old locset, and then evaluate the result of the
13643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * expression for all the element in the locset. use it to grow
13644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * up a new locset.
13645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_TYPE0(XPATH_LOCATIONSET);
13647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    obj = valuePop(ctxt);
13648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldlocset = obj->user;
13649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((oldlocset == NULL) || (oldlocset->locNr == 0)) {
13652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = 0;
13653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = 0;
13654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, obj);
13663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        CHECK_ERROR0;
13664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newlocset = xmlXPtrLocationSetCreate(NULL);
13667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < oldlocset->locNr; i++) {
13669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Run the evaluation with a node list made of a
13671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * single item in the nodelocset.
13672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = oldlocset->locTab[i]->user;
13674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = oldlocset->locNr;
13675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = i + 1;
13676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->context->node);
13678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, tmp);
1367960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
13680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->error != XPATH_EXPRESSION_OK) {
13685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
13686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(0);
13687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The result of the evaluation need to be tested to
13691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * decided whether the filter succeeded or not
13692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPtrLocationSetAdd(newlocset,
13696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlXPathObjectCopy
13697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  (oldlocset->locTab[i]));
13698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Cleanup
13702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->value == tmp) {
13707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            res = valuePop(ctxt);
13708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = NULL;
13712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * The result is used as the new evaluation locset.
13716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathReleaseObject(ctxt->context, obj);
13718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->contextSize = -1;
13720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->proximityPosition = -1;
13721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
13722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = oldnode;
13723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
13726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Extract the old set, and then evaluate the result of the
13729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * expression for all the element in the set. use it to grow
13730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * up a new set.
13731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                CHECK_TYPE0(XPATH_NODESET);
13733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                obj = valuePop(ctxt);
13734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldset = obj->nodesetval;
13735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldnode = ctxt->context->node;
13737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		oldDoc = ctxt->context->doc;
13738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->node = NULL;
13739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((oldset == NULL) || (oldset->nodeNr == 0)) {
13741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->contextSize = 0;
13742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->proximityPosition = 0;
13743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
13744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (op->ch2 != -1)
13745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total +=
13746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathCompOpEval(ctxt,
13747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               &comp->steps[op->ch2]);
13748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    CHECK_ERROR0;
13749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = valuePop(ctxt);
13750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != NULL)
13751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathFreeObject(res);
13752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
13753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, obj);
13754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = oldnode;
13755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_ERROR0;
13756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
13757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = NULL;
13758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Initialize the new set.
13760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * Also set the xpath document in case things like
13761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * key() evaluation are attempted on the predicate
13762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newset = xmlXPathNodeSetCreate(NULL);
13764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
13765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC XPath 1.0:
13766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  "For each node in the node-set to be filtered, the
13767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  PredicateExpr is evaluated with that node as the
13768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  context node, with the number of nodes in the
13769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  node-set as the context size, and with the proximity
13770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  position of the node in the node-set with respect to
13771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  the axis as the context position;"
13772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * @oldset is the node-set" to be filtered.
13773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
13774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC XPath 1.0:
13775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  "only predicates change the context position and
13776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  context size (see [2.4 Predicates])."
13777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Example:
13778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   node-set  context pos
13779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nA         1
13780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nB         2
13781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nC         3
13782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   After applying predicate [position() > 1] :
13783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   node-set  context pos
13784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nB         1
13785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nC         2
13786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
13787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * removed the first node in the node-set, then
1378860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * the context position of the
13789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
13790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < oldset->nodeNr; i++) {
13791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Run the evaluation with a node list made of
13793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * a single item in the nodeset.
13794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = oldset->nodeTab[i];
13796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) &&
13797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (oldset->nodeTab[i]->doc != NULL))
13798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		            ctxt->context->doc = oldset->nodeTab[i]->doc;
13799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (tmp == NULL) {
13800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxt->context->node);
13802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
13803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathNodeSetAddUnique(tmp->nodesetval,
13804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxt->context->node);
13805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, tmp);
13807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = oldset->nodeNr;
13808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = i + 1;
13809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
13810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Evaluate the predicate against the context node.
13811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Can/should we optimize position() predicates
13812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* here (e.g. "[1]")?
13813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
13814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->error != XPATH_EXPRESSION_OK) {
13819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeNodeSet(newset);
13820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
13821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(0);
13822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The result of the evaluation needs to be tested to
13826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * decide whether the filter succeeded or not
13827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
13829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* OPTIMIZE TODO: Can we use
13830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* xmlXPathNodeSetAdd*Unique()* instead?
13831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
13832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]);
13835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Cleanup
13839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->value == tmp) {
13844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            valuePop(ctxt);
1384560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    xmlXPathNodeSetClear(tmp->nodesetval, 1);
13846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
13847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * Don't free the temporary nodeset
13848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * in order to avoid massive recreation inside this
13849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * loop.
13850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
13851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else
13852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp = NULL;
13853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = NULL;
13854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (tmp != NULL)
13856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathReleaseObject(ctxt->context, tmp);
13857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * The result is used as the new evaluation set.
13859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathReleaseObject(ctxt->context, obj);
13861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->contextSize = -1;
13863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->proximityPosition = -1;
13864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* may want to move this past the '}' later */
13865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->doc = oldDoc;
13866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt,
13867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathCacheWrapNodeSet(ctxt->context, newset));
13868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->node = oldnode;
13870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
13873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL) &&
13877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ctxt->value->type == XPATH_NODESET) &&
13878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ctxt->value->nodesetval != NULL) &&
13879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval->nodeNr > 1))
13880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
13881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathNodeSetSort(ctxt->value->nodesetval);
13882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
13885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RANGETO:{
13886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr range;
13887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr res, obj;
13888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr tmp;
13889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlLocationSetPtr newlocset = NULL;
13890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlLocationSetPtr oldlocset;
13891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodeSetPtr oldset;
13892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int i, j;
13893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch2 == -1)
13898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->value->type == XPATH_LOCATIONSET) {
13901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Extract the old locset, and then evaluate the result of the
13903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * expression for all the element in the locset. use it to grow
13904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * up a new locset.
13905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_TYPE0(XPATH_LOCATIONSET);
13907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    obj = valuePop(ctxt);
13908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldlocset = obj->user;
13909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((oldlocset == NULL) || (oldlocset->locNr == 0)) {
13911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ctxt->context->node = NULL;
13912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = 0;
13913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = 0;
13914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]);
13915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, obj);
13920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        CHECK_ERROR0;
13921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newlocset = xmlXPtrLocationSetCreate(NULL);
13924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < oldlocset->locNr; i++) {
13926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Run the evaluation with a node list made of a
13928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * single item in the nodelocset.
13929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = oldlocset->locTab[i]->user;
13931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = oldlocset->locNr;
13932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = i + 1;
13933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->context->node);
13935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, tmp);
13936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->error != XPATH_EXPRESSION_OK) {
13942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
13943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(0);
13944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res->type == XPATH_LOCATIONSET) {
1394860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    xmlLocationSetPtr rloc =
13949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        (xmlLocationSetPtr)res->user;
13950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (j=0; j<rloc->locNr; j++) {
13951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        range = xmlXPtrNewRange(
13952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  oldlocset->locTab[i]->user,
13953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  oldlocset->locTab[i]->index,
13954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  rloc->locTab[j]->user2,
13955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  rloc->locTab[j]->index2);
13956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (range != NULL) {
13957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlXPtrLocationSetAdd(newlocset, range);
13958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
13959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
13960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
13961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    range = xmlXPtrNewRangeNodeObject(
13962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(xmlNodePtr)oldlocset->locTab[i]->user, res);
13963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (range != NULL) {
13964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPtrLocationSetAdd(newlocset,range);
13965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
13966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Cleanup
13970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->value == tmp) {
13975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            res = valuePop(ctxt);
13976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = NULL;
13980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {	/* Not a location set */
13982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_TYPE0(XPATH_NODESET);
13983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    obj = valuePop(ctxt);
13984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldset = obj->nodesetval;
13985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newlocset = xmlXPtrLocationSetCreate(NULL);
13988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (oldset != NULL) {
13990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        for (i = 0; i < oldset->nodeNr; i++) {
13991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            /*
13992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             * Run the evaluation with a node list made of a single item
13993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             * in the nodeset.
13994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             */
13995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->context->node = oldset->nodeTab[i];
13996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
13997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * OPTIMIZE TODO: Avoid recreation for every iteration.
13998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
13999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp = xmlXPathCacheNewNodeSet(ctxt->context,
14000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxt->context->node);
14001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            valuePush(ctxt, tmp);
14002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (op->ch2 != -1)
14004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                total +=
14005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlXPathCompOpEval(ctxt,
14006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
14007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ctxt->error != XPATH_EXPRESSION_OK) {
14008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlXPathFreeObject(obj);
14009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				return(0);
14010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
14011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            res = valuePop(ctxt);
14013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            range =
14014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPtrNewRangeNodeObject(oldset->nodeTab[i],
14015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      res);
14016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (range != NULL) {
14017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPtrLocationSetAdd(newlocset, range);
14018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
14019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            /*
14021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             * Cleanup
14022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             */
14023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (res != NULL) {
14024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlXPathReleaseObject(ctxt->context, res);
14025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
14026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ctxt->value == tmp) {
14027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                res = valuePop(ctxt);
14028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlXPathReleaseObject(ctxt->context, res);
14029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
14030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->context->node = NULL;
14032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
14033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
14034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
14035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
14037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * The result is used as the new evaluation set.
14038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
14039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, obj);
14040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->node = NULL;
14041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->contextSize = -1;
14042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->proximityPosition = -1;
14043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
14044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
14045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
14046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
14047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
14049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "XPath: unknown precompiled operation %d\n", op->op);
14050df143a5041f03a22808b59c76698770b74692815Selim Gurun    ctxt->error = XPATH_INVALID_OPERAND;
14051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (total);
14052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalToBoolean:
14056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context
14057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if the expression evaluates to true.
14059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if false and -1 on API or internal errors.
14061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
14064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
14065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int isPredicate)
14066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr resObj = NULL;
14068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstart:
14070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* comp = ctxt->comp; */
14071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
14072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
14073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
14074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_VALUE:
14075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resObj = (xmlXPathObjectPtr) op->value4;
14076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (isPredicate)
14077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathEvaluatePredicateResult(ctxt, resObj));
14078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCastToBoolean(resObj));
14079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_SORT:
14080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We don't need sorting for boolean results. Skip this one.
14082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1) {
14084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		op = &ctxt->comp->steps[op->ch1];
14085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto start;
14086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
14088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_COLLECT:
14089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch1 == -1)
14090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]);
14093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK)
14094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
14095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1);
14097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK)
14098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
14099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resObj = valuePop(ctxt);
14101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resObj == NULL)
14102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
14103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
14104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
14105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fallback to call xmlXPathCompOpEval().
14107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompOpEval(ctxt, op);
14109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK)
14110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1411160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resObj = valuePop(ctxt);
14113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resObj == NULL)
14114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
14115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
14116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resObj) {
14119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int res;
14120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (resObj->type == XPATH_BOOLEAN) {
14122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = resObj->boolval;
14123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (isPredicate) {
14124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * For predicates a result of type "number" is handled
14126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * differently:
14127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC XPath 1.0:
14128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "If the result is a number, the result will be converted
14129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  to true if the number is equal to the context position
14130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  and will be converted to false otherwise;"
14131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1413260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    res = xmlXPathEvaluatePredicateResult(ctxt, resObj);
14133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathCastToBoolean(resObj);
14135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, resObj);
14137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(res);
14138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunStreamEval:
14146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
14147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled Streamable XPath expression in the given context.
14149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp,
14152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlXPathObjectPtr *resultSeq, int toBool)
14153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int max_depth, min_depth;
1415560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int from_root;
14156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, depth;
14157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int eval_all_nodes;
14158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur = NULL, limit = NULL;
14159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStreamCtxtPtr patstream = NULL;
1416060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1416160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int nb_nodes = 0;
14162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (comp == NULL))
14164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max_depth = xmlPatternMaxDepth(comp);
14166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (max_depth == -1)
14167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (max_depth == -2)
14169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        max_depth = 10000;
14170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min_depth = xmlPatternMinDepth(comp);
14171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min_depth == -1)
14172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    from_root = xmlPatternFromRoot(comp);
14174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from_root < 0)
14175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
14177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("stream eval: depth %d from root %d\n", max_depth, from_root);
14178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! toBool) {
14181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (resultSeq == NULL)
14182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL);
14184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*resultSeq == NULL)
14185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1418760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * handle the special cases of "/" amd "." being matched
14190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
14191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min_depth == 0) {
14192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (from_root) {
14193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Select "/" */
14194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toBool)
14195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
14196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
14197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlNodePtr) ctxt->doc);
14198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Select "self::node()" */
14200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toBool)
14201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
14202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node);
14203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (max_depth == 0) {
14206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from_root) {
14210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = (xmlNodePtr)ctxt->doc;
14211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->node != NULL) {
14212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (ctxt->node->type) {
14213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
14214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
14215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
14216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
14217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
14218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCB_DOCUMENT_NODE:
14219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        cur = ctxt->node;
14221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE:
14223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
14224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
14225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
14226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
14227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
14228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
14229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
14230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DTD_NODE:
14231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
14232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_DECL:
14233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_DECL:
14234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_DECL:
14235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NAMESPACE_DECL:
14236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_XINCLUDE_START:
14237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_XINCLUDE_END:
14238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	limit = cur;
14241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
14243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
14244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    patstream = xmlPatternGetStreamCtxt(comp);
14247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (patstream == NULL) {
14248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* QUESTION TODO: Is this an error?
14250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    eval_all_nodes = xmlStreamWantsAnyNode(patstream);
14255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from_root) {
14257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStreamPush(patstream, NULL, NULL);
14258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
14259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ret == 1) {
14260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toBool)
14261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto return_1;
14262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur);
14263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    depth = 0;
14266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    goto scan_children;
14267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_node:
14268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nb_nodes++;
14270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->type) {
14272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_NODE:
14273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_TEXT_NODE:
14274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_CDATA_SECTION_NODE:
14275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_COMMENT_NODE:
14276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_PI_NODE:
14277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->type == XML_ELEMENT_NODE) {
14278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStreamPush(patstream, cur->name,
14279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(cur->ns ? cur->ns->href : NULL));
14280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (eval_all_nodes)
14281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type);
14282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
14283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1428460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
14286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* NOP. */
14287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (ret == 1) {
14288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (toBool)
14289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto return_1;
14290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur);
14291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((cur->children == NULL) || (depth >= max_depth)) {
14293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStreamPop(patstream);
14294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (cur->next != NULL) {
14295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->next;
14296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((cur->type != XML_ENTITY_DECL) &&
14297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (cur->type != XML_DTD_NODE))
14298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto next_node;
14299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
14302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectscan_children:
14306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->children != NULL) && (depth < max_depth)) {
14307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1430860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	     * Do not descend on entities declarations
14309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
14310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->children->type != XML_ENTITY_DECL) {
14311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->children;
14312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		depth++;
14313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Skip DTDs
14315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
14316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->type != XML_DTD_NODE)
14317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
14318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == limit)
14322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
14323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur->next != NULL) {
14325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
14326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->type != XML_ENTITY_DECL) &&
14327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->type != XML_DTD_NODE))
14328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_node;
14329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1433060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
14332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->parent;
14333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    depth--;
14334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur == NULL) || (cur == limit))
14335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        goto done;
14336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->type == XML_ELEMENT_NODE) {
14337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlStreamPop(patstream);
14338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((eval_all_nodes) &&
14339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->type == XML_TEXT_NODE) ||
14340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->type == XML_CDATA_SECTION_NODE) ||
14341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->type == XML_COMMENT_NODE) ||
14342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->type == XML_PI_NODE)))
14343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlStreamPop(patstream);
14345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->next != NULL) {
14347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
14348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
14351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((cur != NULL) && (depth >= 0));
14353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
14355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
14357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("stream eval: checked %d nodes selected %d\n",
14358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           nb_nodes, retObj->nodesetval->nodeNr);
14359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (patstream)
14362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeStreamCtxt(patstream);
14363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectreturn_1:
14366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (patstream)
14367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeStreamCtxt(patstream);
14368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
14369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */
14371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunEval:
14374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
14375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool:  evaluate to a boolean result
14376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context.
14378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool)
14381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->comp == NULL))
14385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueTab == NULL) {
14388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Allocate the value stack */
1438960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ctxt->valueTab = (xmlXPathObjectPtr *)
14390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlMalloc(10 * sizeof(xmlXPathObjectPtr));
14391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->valueTab == NULL) {
14392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathPErrMemory(ctxt, "creating evaluation context\n");
14393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ctxt);
14394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueNr = 0;
14396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueMax = 10;
14397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value = NULL;
14398df143a5041f03a22808b59c76698770b74692815Selim Gurun        ctxt->valueFrame = 0;
14399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->comp->stream) {
14402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int res;
14403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (toBool) {
14405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluation to boolean result.
14407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathRunStreamEval(ctxt->context,
14409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->comp->stream, NULL, 1);
14410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1)
14411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(res);
14412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1441360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathObjectPtr resObj = NULL;
14414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluation to a sequence.
14417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathRunStreamEval(ctxt->context,
14419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->comp->stream, &resObj, 0);
14420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != -1) && (resObj != NULL)) {
14422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, resObj);
14423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resObj != NULL)
1442660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlXPathReleaseObject(ctxt->context, resObj);
14427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* QUESTION TODO: This falls back to normal XPath evaluation
14430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* if res == -1. Is this intended?
14431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
14435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->last < 0) {
14436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "xmlXPathRunEval: last is less than zero\n");
14438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (toBool)
14441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCompOpEvalToBoolean(ctxt,
14442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &comp->steps[comp->last], 0));
14443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
14444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]);
14445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
14450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1445160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *			Public interfaces				*
14452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
14453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
14454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalPredicate:
14457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res:  the Predicate Expression evaluation result
14459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node.
14461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting
14462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will
14463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the
14464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position
14465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result
14466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call
1446760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * to the boolean function.
14468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise
14470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
14472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) {
14473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (res == NULL)) return(0);
14474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (res->type) {
14475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
14476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->boolval);
14477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
14478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->floatval == ctxt->proximityPosition);
14479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
14480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
14481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res->nodesetval == NULL)
14482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->nodesetval->nodeNr != 0);
14484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
14485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return((res->stringval != NULL) &&
14486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (xmlStrlen(res->stringval) != 0));
14487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
14488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
14489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvaluatePredicateResult:
14495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
14496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res:  the Predicate Expression evaluation result
14497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node.
14499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting
14500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will
14501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the
14502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position
14503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result
14504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call
1450560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * to the boolean function.
14506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise
14508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1451060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt,
14511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathObjectPtr res) {
14512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (res == NULL)) return(0);
14513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (res->type) {
14514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
14515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->boolval);
14516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
14517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200))
14518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return((res->floatval == ctxt->context->proximityPosition) &&
14519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/
14520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
14521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->floatval == ctxt->context->proximityPosition);
14522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
14524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
14525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res->nodesetval == NULL)
14526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->nodesetval->nodeNr != 0);
14528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
14529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return((res->stringval != NULL) && (res->stringval[0] != 0));
14530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
14531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:{
14532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlLocationSetPtr ptr = res->user;
14533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ptr == NULL)
14534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(0);
14535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ptr->locNr != 0);
14536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
14539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
14540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTryStreamCompile:
14547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context
14548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the XPath expression as a streamable subset.
14551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL if failed to compile.
14553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr
14555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) {
14556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Optimization: use streaming patterns when the XPath expression can
14558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * be compiled to a stream lookup
14559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
14560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPatternPtr stream;
14561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict = NULL;
14563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar **namespaces = NULL;
14564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNsPtr ns;
14565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
14566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) &&
14568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (!xmlStrchr(str, '@'))) {
14569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *tmp;
14570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * We don't try to handle expressions using the verbose axis
14573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * specifiers ("::"), just the simplied form at this point.
14574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Additionally, if there is no list of namespaces available and
14575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  there's a ":" in the expression, indicating a prefixed QName,
14576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  then we won't try to compile either. xmlPatterncompile() needs
14577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  to have a list of namespaces at compilation time in order to
14578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  compile prefixed name tests.
14579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
14580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlStrchr(str, ':');
14581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp != NULL) &&
14582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':')))
1458360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return(NULL);
14584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt != NULL) {
14586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dict = ctxt->dict;
14587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->nsNr > 0) {
14588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*));
14589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (namespaces == NULL) {
14590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(ctxt, "allocating namespaces array\n");
14591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
14592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0, j = 0; (j < ctxt->nsNr); j++) {
14594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = ctxt->namespaces[j];
14595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    namespaces[i++] = ns->href;
14596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    namespaces[i++] = ns->prefix;
14597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		namespaces[i++] = NULL;
14599df143a5041f03a22808b59c76698770b74692815Selim Gurun		namespaces[i] = NULL;
14600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH,
14604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&namespaces[0]);
14605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (namespaces != NULL) {
14606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **)namespaces);
1460760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
14608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) {
14609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp = xmlXPathNewCompExpr();
14610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (comp == NULL) {
14611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathErrMemory(ctxt, "allocating streamable expression\n");
14612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
14613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->stream = stream;
14615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->dict = dict;
14616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (comp->dict)
14617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDictReference(comp->dict);
14618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(comp);
14619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreePattern(stream);
14621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
14623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */
14625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCanRewriteDosExpression(xmlChar *expr)
14628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (expr == NULL)
14630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((*expr == '/') && (*(++expr) == '/'))
14633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
14634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*expr++);
14635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
14638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRewriteDOSExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op)
14639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Try to rewrite "descendant-or-self::node()/foo" to an optimized
14642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * internal representation.
14643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1) {
14645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((op->op == XPATH_OP_COLLECT /* 11 */) &&
1464660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    ((xmlXPathAxisVal) op->value == AXIS_CHILD /* 4 */) &&
14647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlXPathTestVal) op->value2 == NODE_TEST_NAME /* 5 */) &&
14648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlXPathTypeVal) op->value3 == NODE_TYPE_NODE /* 0 */))
14649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is a "child::foo"
14652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1465360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlXPathStepOpPtr prevop = &comp->steps[op->ch1];
14654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((prevop->op == XPATH_OP_COLLECT /* 11 */) &&
1465660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		(prevop->ch1 != -1) &&
14657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlXPathAxisVal) prevop->value ==
14658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AXIS_DESCENDANT_OR_SELF) &&
14659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(prevop->ch2 == -1) &&
14660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) &&
14661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE) &&
14662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(comp->steps[prevop->ch1].op == XPATH_OP_ROOT))
1466360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    {
14664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This is a "/descendant-or-self::node()" without predicates.
14666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Eliminate it.
14667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		op->ch1 = prevop->ch1;
1466960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		op->rewriteType = XP_REWRITE_DOS_CHILD_ELEM;
14670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (op->ch1 != -1)
14673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch1]);
14674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1)
14676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch2]);
14677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCtxtCompile:
14681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context
14682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression
14685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL.
14687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr
14690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) {
14691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr pctxt;
14692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = xmlXPathTryStreamCompile(ctxt, str);
14696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp != NULL)
14697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(comp);
14698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlXPathNewParserContext(str, ctxt);
14703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
14704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
14705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompileExpr(pctxt, 1);
14706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if( pctxt->error != XPATH_EXPRESSION_OK )
14708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
14709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathFreeParserContext(pctxt);
14710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
14711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*pctxt->cur != 0) {
1471460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
14715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * aleksey: in some cases this line prints *second* error message
14716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * (see bug #78858) and probably this should be fixed.
14717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * However, we are not sure that all error messages are printed
14718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * out in other places. It's not critical so we leave it as-is for now
14719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
14720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
14721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp = NULL;
14722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp = pctxt->comp;
14724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->comp = NULL;
14725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(pctxt);
14727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp != NULL) {
14729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->expr = xmlStrdup(str);
14730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
14731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->string = xmlStrdup(str);
14732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->nb = 0;
1473360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
14734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((comp->expr != NULL) &&
14735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->nbStep > 2) &&
14736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->last >= 0) &&
14737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathCanRewriteDosExpression(comp->expr) == 1))
14738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRewriteDOSExpression(comp, &comp->steps[comp->last]);
14740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(comp);
14743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompile:
14747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression
14750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL.
14752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr
14755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompile(const xmlChar *str) {
14756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCtxtCompile(NULL, str));
14757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalInternal:
14761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled XPath expression
14762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @resObj: the resulting XPath object or NULL
14764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool: 1 if only a boolean result is requested
14765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context.
14767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free @resObj.
14768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp,
14774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlXPathContextPtr ctxt,
14775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlXPathObjectPtr *resObj,
14776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int toBool)
14777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1477860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathParserContextPtr pctxt;
14779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
14780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    static int reentance = 0;
14781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
14783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_CTXT_NEG(ctxt)
14785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp == NULL)
14787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
14791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reentance++;
14792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (reentance > 1)
14793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDisableOptimizer = 1;
14794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
14797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->nb++;
14798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp->string != NULL) && (comp->nb > 100)) {
14799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(stderr, "100 x %s\n", comp->string);
14800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->nb = 0;
14801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlXPathCompParserContext(comp, ctxt);
14804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlXPathRunEval(pctxt, toBool);
14805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resObj) {
1480760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (pctxt->value == NULL) {
14808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
14809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathCompiledEval: evaluation failed\n");
1481060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *resObj = NULL;
14811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *resObj = valuePop(pctxt);
14813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1481560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Pop all remaining objects from the stack.
14818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->valueNr > 0) {
14820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp;
14821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int stack = 0;
14822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
14824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = valuePop(pctxt);
14825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != NULL) {
1482660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		stack++;
14827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt, tmp);
14828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (tmp != NULL);
14830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((stack != 0) &&
14831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((toBool) || ((resObj) && (*resObj))))
14832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
14834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathCompiledEval: %d objects left on the stack.\n",
14835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stack);
14836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1483860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) {
14840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(*resObj);
14841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*resObj = NULL;
1484260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
14843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->comp = NULL;
14844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(pctxt);
14845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
14846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reentance--;
14847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEval:
14854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled XPath expression
14855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  the XPath context
14856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context.
14858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
14863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx)
14864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res = NULL;
14866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompiledEvalInternal(comp, ctx, &res, 0);
14868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalToBoolean:
14873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled XPath expression
14874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the XPath boolean() function on the result of the given
14877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compiled expression.
14878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the expression evaluated to true, 0 if to false and
14880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -1 in API and internal errors.
14881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
14883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
14884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathContextPtr ctxt)
14885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1));
14887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpr:
14891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
14892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate an XPath expression in the given context,
14894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then push the result on the context stack
14895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
14897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) {
14898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
1490360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base);
14906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp != NULL) {
14907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->comp != NULL)
14908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeCompExpr(ctxt->comp);
14909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->comp = comp;
14910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cur != NULL)
14911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (*ctxt->cur != 0) ctxt->cur++;
14912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
14913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
14915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 1);
14916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* In this scenario the expression string will sit in ctxt->base.
14918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt->error == XPATH_EXPRESSION_OK) &&
14920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->comp != NULL) &&
14921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->base != NULL) &&
14922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->comp->nbStep > 2) &&
14923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->comp->last >= 0) &&
14924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathCanRewriteDosExpression((xmlChar *) ctxt->base) == 1))
14925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRewriteDOSExpression(ctxt->comp,
14927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&ctxt->comp->steps[ctxt->comp->last]);
14928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
1493160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlXPathRunEval(ctxt, 0);
14932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEval:
14936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  the XPath context
14938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath Location Path in the given context.
14940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
14945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) {
14946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ctxt;
14947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res, tmp, init = NULL;
14948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stack = 0;
14949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_CTXT(ctx)
14951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt = xmlXPathNewParserContext(str, ctx);
14955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
14956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
14957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathEvalExpr(ctxt);
14958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL) {
14960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathEval: evaluation failed\n");
14962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
1496360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL)
14964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            && (ctxt->comp->stream == NULL)
14966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      ) {
14968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
14969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
14970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(ctxt);
14972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = valuePop(ctxt);
14976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
14977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != init)
14978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stack++;
14979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctx, tmp);
14980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
14981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (tmp != NULL);
14982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((stack != 0) && (res != NULL)) {
14983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathEval: %d object left on the stack\n",
14985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        stack);
14986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->error != XPATH_EXPRESSION_OK) {
14988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(res);
14989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
14990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(ctxt);
14993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpression:
14998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
15000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath expression in the given context.
15002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
15004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
15005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
15007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) {
15008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr pctxt;
15009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res, tmp;
15010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stack = 0;
15011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_CTXT(ctxt)
15013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
15015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlXPathNewParserContext(str, ctxt);
15017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
15018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
15019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathEvalExpr(pctxt);
15020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) {
15022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
15023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
15024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
15025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(pctxt);
15026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
15028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = valuePop(pctxt);
15029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
15030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt, tmp);
15031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    stack++;
15032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (tmp != NULL);
15034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((stack != 0) && (res != NULL)) {
15035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
15036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathEvalExpression: %d object left on the stack\n",
15037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        stack);
15038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(pctxt);
15040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
15041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
15044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
15045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Extra functions not pertaining to the XPath spec		*
15046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
15047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
15048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEscapeUriFunction:
15050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
15051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
15052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the escape-uri() XPath function
15054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string escape-uri(string $str, bool $escape-reserved)
15055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function applies the URI escaping rules defined in section 2 of [RFC
15057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2396] to the string supplied as $uri-part, which typically represents all
15058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or part of a URI. The effect of the function is to replace any special
15059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string by an escape sequence of the form %xx%yy...,
15060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * where xxyy... is the hexadecimal representation of the octets used to
15061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * represent the character in UTF-8.
15062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The set of characters that are escaped depends on the setting of the
15064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean argument $escape-reserved.
15065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is true, all characters are escaped other than lower
15067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case letters a-z, upper case letters A-Z, digits 0-9, and the characters
15068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!"
15069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only
15070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and
15071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A-F).
15072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is false, the behavior differs in that characters
15074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as reserved characters are not escaped. These
15075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",".
1507660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
15077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [RFC 2396] does not define whether escaped URIs should use lower case or
15078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upper case for hexadecimal digits. To ensure that escaped URIs can be
15079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compared using string comparison functions, this function must always use
15080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the upper-case letters A-F.
1508160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
15082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generally, $escape-reserved should be set to true when escaping a string
15083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is to form a single part of a URI, and to false when escaping an
15084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entire URI or URI reference.
1508560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1508660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * In the case of non-ascii characters, the string is encoded according to
15087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * utf-8 and then converted according to RFC 2396.
15088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Examples
1509060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *  xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true())
15091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean"
15092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false())
15093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean"
15094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
15097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) {
15098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr str;
15099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int escape_reserved;
15100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferPtr target;
15101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cptr;
15102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar escape[4];
1510360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(2);
1510560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    escape_reserved = xmlXPathPopBoolean(ctxt);
1510760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
15109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = valuePop(ctxt);
1511060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    target = xmlBufferCreate();
1511260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    escape[0] = '%';
15114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    escape[3] = 0;
1511560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (target) {
15117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (cptr = str->stringval; *cptr; cptr++) {
15118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((*cptr >= 'A' && *cptr <= 'Z') ||
15119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*cptr >= 'a' && *cptr <= 'z') ||
15120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*cptr >= '0' && *cptr <= '9') ||
1512160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*cptr == '-' || *cptr == '_' || *cptr == '.' ||
15122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cptr == '!' || *cptr == '~' || *cptr == '*' ||
15123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cptr == '\''|| *cptr == '(' || *cptr == ')' ||
1512460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		(*cptr == '%' &&
15125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((cptr[1] >= 'A' && cptr[1] <= 'F') ||
15126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[1] >= 'a' && cptr[1] <= 'f') ||
15127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[1] >= '0' && cptr[1] <= '9')) &&
15128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((cptr[2] >= 'A' && cptr[2] <= 'F') ||
15129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[2] >= 'a' && cptr[2] <= 'f') ||
15130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[2] >= '0' && cptr[2] <= '9'))) ||
15131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!escape_reserved &&
15132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (*cptr == ';' || *cptr == '/' || *cptr == '?' ||
15133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  *cptr == ':' || *cptr == '@' || *cptr == '&' ||
15134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  *cptr == '=' || *cptr == '+' || *cptr == '$' ||
15135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  *cptr == ','))) {
15136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlBufferAdd(target, cptr, 1);
15137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
15138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*cptr >> 4) < 10)
15139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[1] = '0' + (*cptr >> 4);
15140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
15141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[1] = 'A' - 10 + (*cptr >> 4);
15142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*cptr & 0xF) < 10)
15143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[2] = '0' + (*cptr & 0xF);
15144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
15145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[2] = 'A' - 10 + (*cptr & 0xF);
1514660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlBufferAdd(target, &escape[0], 3);
15148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
15152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
15153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
15154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, str);
15155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterAllFunctions:
15159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
15160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers all default XPath functions in this context
15162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
15164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt)
15165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean",
15167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathBooleanFunction);
15168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling",
15169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathCeilingFunction);
15170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count",
15171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathCountFunction);
15172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat",
15173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathConcatFunction);
15174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains",
15175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathContainsFunction);
15176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id",
15177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathIdFunction);
15178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false",
15179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathFalseFunction);
15180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor",
15181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathFloorFunction);
15182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last",
15183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathLastFunction);
15184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang",
15185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathLangFunction);
15186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name",
15187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathLocalNameFunction);
15188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not",
15189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNotFunction);
15190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name",
15191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNameFunction);
15192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri",
15193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNamespaceURIFunction);
15194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space",
15195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNormalizeFunction);
15196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number",
15197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNumberFunction);
15198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position",
15199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathPositionFunction);
15200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round",
15201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathRoundFunction);
15202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string",
15203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathStringFunction);
15204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length",
15205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathStringLengthFunction);
15206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with",
15207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathStartsWithFunction);
15208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring",
15209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSubstringFunction);
15210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before",
15211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSubstringBeforeFunction);
15212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after",
15213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSubstringAfterFunction);
15214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum",
15215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSumFunction);
15216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true",
15217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathTrueFunction);
15218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate",
15219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathTranslateFunction);
15220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri",
15222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions",
15223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathEscapeUriFunction);
15224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPATH_ENABLED */
15227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xpath
15228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
15229