xpath.c revision ab4e2e90f63db6b1cd8bb2e453cac899ef43d42b
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
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#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.
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
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/************************************************************************
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Floating point stuff				*
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
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/
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
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/
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
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/
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
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 */
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG */
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_STEP */
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_STEP_NTH */
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_EXPR */
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_EVAL_COUNTS */
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
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
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",
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "?? Unknown error ??\n"	/* Must be last in the list! */
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) /	\
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   sizeof(xmlXPathErrorMessages[0])) - 1)
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErrMemory:
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath context
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra)
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (extra) {
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar buf[200];
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlStrPrintf(buf, 200,
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         BAD_CAST "Memory allocation failed : %s\n",
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         extra);
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->lastError.message = (char *) xmlStrdup(buf);
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->lastError.message = (char *)
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       xmlStrdup(BAD_CAST "Memory allocation failed\n");
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->lastError.domain = XML_FROM_XPATH;
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->lastError.code = XML_ERR_NO_MEMORY;
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->error != NULL)
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->error(ctxt->userData, &ctxt->lastError);
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (extra)
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __xmlRaiseError(NULL, NULL, NULL,
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL, NULL, XML_FROM_XPATH,
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0,
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            extra, NULL, NULL, 0, 0,
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "Memory allocation failed : %s\n", extra);
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __xmlRaiseError(NULL, NULL, NULL,
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL, NULL, XML_FROM_XPATH,
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0,
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL, NULL, NULL, 0, 0,
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "Memory allocation failed\n");
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPErrMemory:
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra)
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(NULL, extra);
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->error = XPATH_MEMORY_ERROR;
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(ctxt->context, extra);
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErr:
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a XPath parser context
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error:  the error code
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an XPath error
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErr(xmlXPathParserContextPtr ctxt, int error)
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((error < 0) || (error > MAXERRNO))
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	error = MAXERRNO;
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, XML_FROM_XPATH,
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK,
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, NULL, 0, 0,
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathErrorMessages[error]);
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = error;
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context == NULL) {
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, XML_FROM_XPATH,
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK,
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const char *) ctxt->base, NULL, NULL,
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->cur - ctxt->base, 0,
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathErrorMessages[error]);
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* cleanup current last error */
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlResetError(&ctxt->context->lastError);
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.domain = XML_FROM_XPATH;
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK -
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           XPATH_EXPRESSION_OK;
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.level = XML_ERR_ERROR;
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base);
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.int1 = ctxt->cur - ctxt->base;
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->lastError.node = ctxt->context->debugNode;
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->error != NULL) {
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->error(ctxt->context->userData,
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     &ctxt->context->lastError);
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, ctxt->context->debugNode, XML_FROM_XPATH,
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK,
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_ERR_ERROR, NULL, 0,
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const char *) ctxt->base, NULL, NULL,
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->cur - ctxt->base, 0,
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathErrorMessages[error]);
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
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 * xmlXPatherror:
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @file:  the file name
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @line:  the line number
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @no:  the error number
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formats an error message.
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED,
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              int line ATTRIBUTE_UNUSED, int no) {
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathErr(ctxt, no);
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Utilities	    				*
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerList:
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pointer-list for various purposes.
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlPointerList xmlPointerList;
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlPointerList *xmlPointerListPtr;
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlPointerList {
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void **items;
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int number;
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Since such a list-handling is used in xmlschemas.c and libxslt
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* and here, we should make the functions public.
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListAddSize(xmlPointerListPtr list,
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       void *item,
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int initialSize)
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (initialSize <= 0)
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize = 1;
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize * sizeof(void *));
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL,
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlPointerListCreate: allocating item\n");
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->number = 0;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->size = initialSize;
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->size <= list->number) {
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->size *= 2;
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->size * sizeof(void *));
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL,
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlPointerListCreate: re-allocating item\n");
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->size = 0;
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->items[list->number++] = item;
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListCreate:
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an xsltPointerList structure.
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a xsltPointerList structure or NULL in case of an error.
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlPointerListPtr
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListCreate(int initialSize)
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr ret;
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlMalloc(sizeof(xmlPointerList));
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(NULL,
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "xmlPointerListCreate: allocating item\n");
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlPointerList));
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (initialSize > 0) {
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlPointerListAddSize(ret, NULL, initialSize);
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->number = 0;
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListFree:
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees the xsltPointerList structure. This does not free
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content of the list.
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListFree(xmlPointerListPtr list)
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL)
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items != NULL)
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Parser Types					*
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Types are private:
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_END=0,
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_AND,
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_OR,
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_EQUAL,
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_CMP,
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_PLUS,
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_MULT,
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_UNION,
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_ROOT,
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_NODE,
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_RESET, /* 10 */
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_COLLECT,
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_VALUE, /* 12 */
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_VARIABLE,
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_FUNCTION,
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_ARG,
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_PREDICATE,
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_FILTER, /* 17 */
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XPATH_OP_SORT /* 18 */
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ,XPATH_OP_RANGETO
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathOp;
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_ANCESTOR = 1,
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_ANCESTOR_OR_SELF,
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_ATTRIBUTE,
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_CHILD,
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_DESCENDANT,
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_DESCENDANT_OR_SELF,
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_FOLLOWING,
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_FOLLOWING_SIBLING,
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_NAMESPACE,
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_PARENT,
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_PRECEDING,
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_PRECEDING_SIBLING,
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    AXIS_SELF
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathAxisVal;
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_NONE = 0,
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_TYPE = 1,
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_PI = 2,
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_ALL = 3,
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_NS = 4,
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TEST_NAME = 5
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTestVal;
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_NODE = 0,
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_COMMENT = XML_COMMENT_NODE,
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_TEXT = XML_TEXT_NODE,
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NODE_TYPE_PI = XML_PI_NODE
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTypeVal;
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_REWRITE_DOS_CHILD_ELEM 1
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathStepOp xmlXPathStepOp;
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathStepOp *xmlXPathStepOpPtr;
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathStepOp {
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathOp op;		/* The identifier of the operation */
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ch1;			/* First child */
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ch2;			/* Second child */
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value;
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value2;
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value3;
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *value4;
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *value5;
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *cache;
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *cacheURI;
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int rewriteType;
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathCompExpr {
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbStep;			/* Number of steps in this expression */
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxStep;		/* Maximum number of steps allocated */
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOp *steps;	/* ops for computation of this expression */
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int last;			/* index of last step in expression */
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *expr;		/* the expression being computed */
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;		/* the dictionnary to use if any */
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb;
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *string;
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPatternPtr stream;
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Forward declarations				*
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj);
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj);
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathStepOpPtr op, xmlNodePtr *first);
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int isPredicate);
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Parser Type functions 				*
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCompExpr:
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new Xpath component
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCompExpr(void) {
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr cur;
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr));
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "allocating component\n");
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(cur, 0, sizeof(xmlXPathCompExpr));
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->maxStep = 10;
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nbStep = 0;
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep *
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                   sizeof(xmlXPathStepOp));
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->steps == NULL) {
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "allocating steps\n");
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(cur);
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp));
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->last = -1;
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nb = 0;
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeCompExpr:
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  an XPATH comp
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by @comp
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCompExpr(xmlXPathCompExprPtr comp)
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOpPtr op;
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp == NULL)
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->dict == NULL) {
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < comp->nbStep; i++) {
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = &comp->steps[i];
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value4 != NULL) {
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (op->op == XPATH_OP_VALUE)
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(op->value4);
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(op->value4);
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value5 != NULL)
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(op->value5);
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < comp->nbStep; i++) {
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = &comp->steps[i];
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value4 != NULL) {
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (op->op == XPATH_OP_VALUE)
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathFreeObject(op->value4);
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlDictFree(comp->dict);
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->steps != NULL) {
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(comp->steps);
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->string != NULL) {
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(comp->string);
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->stream != NULL) {
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreePatternList(comp->stream);
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->expr != NULL) {
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(comp->expr);
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(comp);
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompExprAdd:
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled expression
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch1: first child index
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch2: second child index
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an op
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the first int value
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second int value
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value3:  the third int value
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value4:  the first string value
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value5:  the second string value
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a step to an XPath Compiled Expression
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the index otherwise
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2,
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   xmlXPathOp op, int value,
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   int value2, int value3, void *value4, void *value5) {
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->nbStep >= comp->maxStep) {
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathStepOp *real;
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->maxStep *= 2;
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	real = (xmlXPathStepOp *) xmlRealloc(comp->steps,
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                      comp->maxStep * sizeof(xmlXPathStepOp));
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (real == NULL) {
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->maxStep /= 2;
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "adding step\n");
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->steps = real;
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->last = comp->nbStep;
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].rewriteType = 0;
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].ch1 = ch1;
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].ch2 = ch2;
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].op = op;
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].value = value;
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].value2 = value2;
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].value3 = value3;
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp->dict != NULL) &&
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) ||
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (op == XPATH_OP_COLLECT))) {
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (value4 != NULL) {
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value4 = (xmlChar *)
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (void *)xmlDictLookup(comp->dict, value4, -1);
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value4);
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value4 = NULL;
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (value5 != NULL) {
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value5 = (xmlChar *)
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (void *)xmlDictLookup(comp->dict, value5, -1);
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value5);
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->steps[comp->nbStep].value5 = NULL;
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->steps[comp->nbStep].value4 = value4;
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->steps[comp->nbStep].value5 = value5;
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->steps[comp->nbStep].cache = NULL;
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(comp->nbStep++);
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompSwap:
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled expression
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: operation index
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Swaps 2 operations in the compiled expression
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompSwap(xmlXPathStepOpPtr op) {
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Since this manipulates possibly shared variables, this is
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * disabled if one detects that the library is used in a multithreaded
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * application
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathDisableOptimizer)
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = op->ch1;
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    op->ch1 = op->ch2;
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    op->ch2 = tmp;
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5)	\
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprAdd(ctxt->comp, (op1), (op2),			\
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                (op), (val), (val2), (val3), (val4), (val5))
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5)			\
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1,		\
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                (op), (val), (val2), (val3), (val4), (val5))
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_LEAVE_EXPR(op, val, val2) 					\
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL)
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_UNARY_EXPR(op, ch, val, val2) 				\
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL)
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) 			\
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op),			\
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(val), (val2), 0 ,NULL ,NULL)
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		XPath object cache structures				*
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEFAULT_CACHE_ON */
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL))
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathContextCache xmlXPathContextCache;
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathContextCache *xmlXPathContextCachePtr;
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathContextCache {
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr nodesetObjs;  /* contains xmlXPathObjectPtr */
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr stringObjs;   /* contains xmlXPathObjectPtr */
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr booleanObjs;  /* contains xmlXPathObjectPtr */
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr numberObjs;   /* contains xmlXPathObjectPtr */
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListPtr miscObjs;     /* contains xmlXPathObjectPtr */
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxNodeset;
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxString;
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxBoolean;
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxNumber;
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxMisc;
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedAll;
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedNodeset;
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedString;
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedBool;
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedNumber;
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedPoint;
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedRange;
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedLocset;
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedUsers;
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedXSLTTree;
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgCachedUndefined;
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedAll;
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedNodeset;
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedString;
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedBool;
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedNumber;
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedPoint;
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedRange;
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedLocset;
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedUsers;
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedXSLTTree;
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int dbgReusedUndefined;
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Debugging related functions				*
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define STRANGE 							\
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error at %s:%d\n",				\
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) {
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Node is NULL !\n");
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type == XML_DOCUMENT_NODE) ||
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (cur->type == XML_HTML_DOCUMENT_NODE)) {
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " /\n");
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->type == XML_ATTRIBUTE_NODE)
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth);
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpOneNode(output, cur, depth);
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) {
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp;
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Node is NULL !\n");
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = cur;
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDebugDumpOneNode(output, tmp, depth);
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) {
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NodeSet is NULL !\n");
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL) {
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Set contains %d nodes:\n", cur->nodeNr);
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < cur->nodeNr;i++) {
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, shift);
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "%d", i + 1);
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1);
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) {
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) {
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Value Tree is NULL !\n");
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, shift);
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d", i + 1);
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1);
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED)
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) {
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "LocationSet is NULL !\n");
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->locNr;i++) {
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, shift);
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%d : ", i + 1);
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1);
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpObject:
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the FILE * to dump the output
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the object to inspect
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth:  indentation level
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the content of the object for debugging purposes
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) {
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL) return;
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, shift);
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "Object is empty (NULL)\n");
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch(cur->type) {
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_UNDEFINED:
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is uninitialized\n");
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a Node Set :\n");
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth);
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is an XSLT value tree :\n");
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth);
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a Boolean : ");
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->boolval) fprintf(output, "true\n");
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else fprintf(output, "false\n");
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (xmlXPathIsInf(cur->floatval)) {
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 1:
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a number : Infinity\n");
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case -1:
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a number : -Infinity\n");
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlXPathIsNaN(cur->floatval)) {
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "Object is a number : NaN\n");
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) {
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "Object is a number : 0\n");
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "Object is a number : %0g\n", cur->floatval);
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a string : ");
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDebugDumpString(output, cur->stringval);
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a point : index %d in node", cur->index);
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1);
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->user2 == NULL) ||
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->user2 == cur->user) && (cur->index == cur->index2))) {
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a collapsed range :\n");
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, shift);
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->index >= 0)
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "index %d in ", cur->index);
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "node\n");
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user,
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              depth + 1);
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else  {
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "Object is a range :\n");
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, shift);
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "From ");
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->index >= 0)
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "index %d in ", cur->index);
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "node\n");
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user,
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              depth + 1);
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, shift);
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "To ");
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->index2 >= 0)
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "index %d in ", cur->index2);
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "node\n");
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2,
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			              depth + 1);
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "\n");
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED)
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is a Location Set:\n");
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpLocationSet(output,
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlLocationSetPtr) cur->user, depth);
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "Object is user defined\n");
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp,
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     xmlXPathStepOpPtr op, int depth) {
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, shift);
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op == NULL) {
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "Step is NULL\n");
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "END"); break;
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_AND:
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "AND"); break;
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_OR:
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "OR"); break;
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_EQUAL:
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value)
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "EQUAL =");
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "EQUAL !=");
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_CMP:
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value)
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "CMP <");
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "CMP >");
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (!op->value2)
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "=");
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PLUS:
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value == 0)
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS -");
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 1)
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS +");
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 2)
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS unary -");
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 3)
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "PLUS unary - -");
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_MULT:
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (op->value == 0)
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "MULT *");
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else if (op->value == 1)
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "MULT div");
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     else
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 fprintf(output, "MULT mod");
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "UNION"); break;
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "ROOT"); break;
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "NODE"); break;
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "RESET"); break;
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     fprintf(output, "SORT"); break;
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT: {
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value;
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathTestVal test = (xmlXPathTestVal)op->value2;
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3;
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *prefix = op->value4;
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *name = op->value5;
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "COLLECT ");
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (axis) {
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_ANCESTOR:
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'ancestors' "); break;
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_ANCESTOR_OR_SELF:
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'ancestors-or-self' "); break;
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_ATTRIBUTE:
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'attributes' "); break;
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_CHILD:
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'child' "); break;
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_DESCENDANT:
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'descendant' "); break;
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_DESCENDANT_OR_SELF:
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'descendant-or-self' "); break;
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_FOLLOWING:
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'following' "); break;
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_FOLLOWING_SIBLING:
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'following-siblings' "); break;
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_NAMESPACE:
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'namespace' "); break;
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_PARENT:
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'parent' "); break;
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_PRECEDING:
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'preceding' "); break;
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_PRECEDING_SIBLING:
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'preceding-sibling' "); break;
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case AXIS_SELF:
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, " 'self' "); break;
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (test) {
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NONE:
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'none' "); break;
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_TYPE:
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'type' "); break;
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_PI:
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'PI' "); break;
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_ALL:
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'all' "); break;
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NS:
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'namespace' "); break;
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NAME:
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'name' "); break;
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (type) {
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_NODE:
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'node' "); break;
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_COMMENT:
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'comment' "); break;
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_TEXT:
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'text' "); break;
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TYPE_PI:
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "'PI' "); break;
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prefix != NULL)
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "%s:", prefix);
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "%s", (const char *) name);
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_VALUE: {
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4;
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ELEM ");
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugDumpObject(output, object, 0);
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto finish;
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_VARIABLE: {
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *prefix = op->value5;
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *name = op->value4;
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prefix != NULL)
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "VARIABLE %s:%s", prefix, name);
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "VARIABLE %s", name);
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_FUNCTION: {
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int nbargs = op->value;
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *prefix = op->value5;
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *name = op->value4;
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prefix != NULL)
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "FUNCTION %s:%s(%d args)",
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prefix, name, nbargs);
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "FUNCTION %s(%d args)", name, nbargs);
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ARG: fprintf(output, "ARG"); break;
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break;
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_FILTER: fprintf(output, "FILTER"); break;
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break;
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "UNKNOWN %d\n", op->op); return;
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfinish:
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 >= 0)
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1);
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 >= 0)
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1);
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpCompExpr:
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the FILE * for the output
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the precompiled XPath expression
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth:  the indentation level.
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the tree of the compiled XPath expression.
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp,
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                  int depth) {
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((output == NULL) || (comp == NULL)) return;
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, shift);
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Compiled Expression : %d elements\n",
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->nbStep);
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = comp->last;
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1);
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XPath object usage related debugging variables.
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUndefined = 0;
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNodeset = 0;
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterBool = 0;
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNumber = 0;
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterString = 0;
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterPoint = 0;
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterRange = 0;
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterLocset = 0;
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUsers = 0;
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterXSLTTree = 0;
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterAll = 0;
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUndefined = 0;
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNodeset = 0;
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalBool = 0;
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNumber = 0;
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalString = 0;
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalPoint = 0;
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalRange = 0;
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalLocset = 0;
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUsers = 0;
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalXSLTTree = 0;
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalAll = 0;
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUndefined = 0;
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNodeset = 0;
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxBool = 0;
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNumber = 0;
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxString = 0;
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxPoint = 0;
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxRange = 0;
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxLocset = 0;
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUsers = 0;
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxXSLTTree = 0;
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxAll = 0;
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt)
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedAll = 0;
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedNodeset = 0;
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedString = 0;
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedBool = 0;
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedNumber = 0;
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedPoint = 0;
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedRange = 0;
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedLocset = 0;
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedUsers = 0;
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedXSLTTree = 0;
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedUndefined = 0;
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedAll = 0;
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedNodeset = 0;
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedString = 0;
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedBool = 0;
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedNumber = 0;
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedPoint = 0;
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedRange = 0;
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedLocset = 0;
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedUsers = 0;
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedXSLTTree = 0;
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedUndefined = 0;
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterUndefined = 0;
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterNodeset = 0;
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterBool = 0;
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterNumber = 0;
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterString = 0;
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterPoint = 0;
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterRange = 0;
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterLocset = 0;
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterUsers = 0;
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterXSLTTree = 0;
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterAll = 0;
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalUndefined = 0;
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalNodeset = 0;
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalBool = 0;
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalNumber = 0;
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalString = 0;
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalPoint = 0;
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalRange = 0;
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalLocset = 0;
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalUsers = 0;
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalXSLTTree = 0;
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjTotalAll = 0;
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxUndefined = 0;
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxNodeset = 0;
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxBool = 0;
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxNumber = 0;
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxString = 0;
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxPoint = 0;
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxRange = 0;
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxLocset = 0;
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxUsers = 0;
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxXSLTTree = 0;
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjMaxAll = 0;
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt,
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathObjectType objType)
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isCached = 0;
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isCached = 1;
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgReusedAll++;
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (objType) {
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_UNDEFINED:
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedUndefined++;
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedNodeset++;
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedBool++;
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedNumber++;
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedString++;
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedPoint++;
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedRange++;
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedLocset++;
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedUsers++;
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgReusedXSLTTree++;
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (objType) {
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_UNDEFINED:
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalUndefined++;
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterUndefined++;
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterUndefined >
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUndefined)
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUndefined =
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterUndefined;
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalNodeset++;
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterNodeset++;
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterNodeset >
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNodeset)
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNodeset =
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterNodeset;
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_BOOLEAN:
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalBool++;
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterBool++;
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterBool >
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxBool)
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxBool =
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterBool;
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER:
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalNumber++;
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterNumber++;
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterNumber >
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNumber)
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxNumber =
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterNumber;
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalString++;
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterString++;
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterString >
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxString)
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxString =
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterString;
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalPoint++;
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterPoint++;
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterPoint >
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxPoint)
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxPoint =
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterPoint;
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalRange++;
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterRange++;
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterRange >
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxRange)
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxRange =
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterRange;
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalLocset++;
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterLocset++;
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterLocset >
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxLocset)
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxLocset =
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterLocset;
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalUsers++;
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterUsers++;
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterUsers >
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUsers)
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxUsers =
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterUsers;
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! isCached)
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjTotalXSLTTree++;
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterXSLTTree++;
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathDebugObjCounterXSLTTree >
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxXSLTTree)
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathDebugObjMaxXSLTTree =
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathDebugObjCounterXSLTTree;
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! isCached)
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjTotalAll++;
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterAll++;
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathDebugObjCounterAll >
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjMaxAll)
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjMaxAll =
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterAll;
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt,
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathObjectType objType)
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isCached = 0;
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isCached = 1;
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->dbgCachedAll++;
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (objType) {
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_UNDEFINED:
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedUndefined++;
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedNodeset++;
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedBool++;
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedNumber++;
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedString++;
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedPoint++;
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedRange++;
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedLocset++;
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedUsers++;
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cache->dbgCachedXSLTTree++;
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (objType) {
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_UNDEFINED:
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterUndefined--;
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterNodeset--;
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_BOOLEAN:
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterBool--;
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER:
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterNumber--;
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterString--;
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterPoint--;
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterRange--;
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterLocset--;
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterUsers--;
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjCounterXSLTTree--;
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjCounterAll--;
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt)
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int reqAll, reqNodeset, reqString, reqBool, reqNumber,
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	reqXSLTTree, reqUndefined;
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int caAll = 0, caNodeset = 0, caString = 0, caBool = 0,
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	caNumber = 0, caXSLTTree = 0, caUndefined = 0;
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int reAll = 0, reNodeset = 0, reString = 0, reBool = 0,
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	reNumber = 0, reXSLTTree = 0, reUndefined = 0;
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int leftObjs = xmlXPathDebugObjCounterAll;
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqAll = xmlXPathDebugObjTotalAll;
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqNodeset = xmlXPathDebugObjTotalNodeset;
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqString = xmlXPathDebugObjTotalString;
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqBool = xmlXPathDebugObjTotalBool;
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqNumber = xmlXPathDebugObjTotalNumber;
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqXSLTTree = xmlXPathDebugObjTotalXSLTTree;
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reqUndefined = xmlXPathDebugObjTotalUndefined;
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# XPath object usage:\n");
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache != NULL) {
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathContextCachePtr cache =
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlXPathContextCachePtr) ctxt->cache;
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reAll = cache->dbgReusedAll;
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqAll += reAll;
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reNodeset = cache->dbgReusedNodeset;
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqNodeset += reNodeset;
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reString = cache->dbgReusedString;
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqString += reString;
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reBool = cache->dbgReusedBool;
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqBool += reBool;
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reNumber = cache->dbgReusedNumber;
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqNumber += reNumber;
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reXSLTTree = cache->dbgReusedXSLTTree;
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqXSLTTree += reXSLTTree;
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reUndefined = cache->dbgReusedUndefined;
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    reqUndefined += reUndefined;
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caAll = cache->dbgCachedAll;
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caBool = cache->dbgCachedBool;
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caNodeset = cache->dbgCachedNodeset;
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caString = cache->dbgCachedString;
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caNumber = cache->dbgCachedNumber;
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caXSLTTree = cache->dbgCachedXSLTTree;
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    caUndefined = cache->dbgCachedUndefined;
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->nodesetObjs)
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->nodesetObjs->number;
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->stringObjs)
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->stringObjs->number;
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->booleanObjs)
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->booleanObjs->number;
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->numberObjs)
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->numberObjs->number;
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cache->miscObjs)
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		leftObjs -= cache->miscObjs->number;
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# all\n");
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqAll);
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   left  : %d\n", leftObjs);
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalAll);
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reAll);
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxAll);
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# node-sets\n");
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqNodeset);
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalNodeset);
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reNodeset);
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxNodeset);
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# strings\n");
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqString);
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalString);
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reString);
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxString);
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# booleans\n");
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqBool);
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalBool);
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reBool);
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxBool);
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# numbers\n");
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqNumber);
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalNumber);
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reNumber);
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxNumber);
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# XSLT result tree fragments\n");
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqXSLTTree);
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalXSLTTree);
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reXSLTTree);
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxXSLTTree);
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("# undefined\n");
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   total  : %d\n", reqUndefined);
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   created: %d\n", xmlXPathDebugObjTotalUndefined);
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   reused : %d\n", reUndefined);
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("#   max    : %d\n", xmlXPathDebugObjMaxUndefined);
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_DEBUG_OBJ_USAGE */
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_DEBUG_ENABLED */
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			XPath object caching				*
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCache:
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new object cache
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCache just allocated.
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathContextCachePtr
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCache(void)
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextCachePtr ret;
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache));
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating object cache\n");
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache));
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxNodeset = 100;
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxString = 100;
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxBoolean = 100;
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxNumber = 100;
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxMisc = 100;
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheFreeObjectList(xmlPointerListPtr list)
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL)
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < list->number; i++) {
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj = list->items[i];
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that it is already assured that we don't need to
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* look out for namespace nodes in the node-set.
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL) {
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodesetval->nodeTab != NULL)
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(obj->nodesetval->nodeTab);
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(obj->nodesetval);
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj);
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjCounterAll--;
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPointerListFree(list);
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCache(xmlXPathContextCachePtr cache)
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache == NULL)
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->nodesetObjs)
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->nodesetObjs);
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->stringObjs)
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->stringObjs);
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->booleanObjs)
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->booleanObjs);
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->numberObjs)
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->numberObjs);
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cache->miscObjs)
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheFreeObjectList(cache->miscObjs);
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(cache);
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContextSetCache:
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @active: enables/disables (creates/frees) the cache
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value with semantics dependant on @options
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: options (currently only the value 0 is used)
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/frees an object cache on the XPath context.
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If activates XPath objects (xmlXPathObject) will be cached internally
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be reused.
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options:
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   0: This will set the XPath object caching:
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      @value:
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        This will set the maximum number of XPath objects
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        to be cached per slot
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        There are 5 slots for: node-set, string, number, boolean, and
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        misc objects. Use <0 for the default number (100).
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Other values for @options have currently no effect.
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the setting succeeded, and -1 on API or internal errors.
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextSetCache(xmlXPathContextPtr ctxt,
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int active,
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int value,
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int options)
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (active) {
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache;
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cache == NULL) {
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cache = xmlXPathNewCache();
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->cache == NULL)
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cache = (xmlXPathContextCachePtr) ctxt->cache;
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (options == 0) {
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value < 0)
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = 100;
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxNodeset = value;
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxString = value;
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxNumber = value;
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxBoolean = value;
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cache->maxMisc = value;
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->cache != NULL) {
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->cache = NULL;
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapNodeSet:
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapNodeSet().
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val)
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache != NULL)) {
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache =
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathContextCachePtr) ctxt->cache;
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->miscObjs != NULL) &&
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NODESET;
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodesetval = val;
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapNodeSet(val));
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapString:
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapString().
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object.
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val)
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache != NULL)) {
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->stringObjs != NULL) &&
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->stringObjs->number != 0))
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->stringObjs->items[--cache->stringObjs->number];
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = val;
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fallback to misc-cache.
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = val;
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapString(val));
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewNodeSet:
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewNodeSet().
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type NodeSet and initialize
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val)
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->nodesetObjs != NULL) &&
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->nodesetObjs->number != 0))
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Use the nodset-cache.
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->nodesetObjs->items[--cache->nodesetObjs->number];
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NODESET;
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = 0;
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val) {
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret->nodesetval->nodeMax == 0) ||
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (val->type == XML_NAMESPACE_DECL))
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetAddUnique(ret->nodesetval, val);
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->nodesetval->nodeTab[0] = val;
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->nodesetval->nodeNr = 1;
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fallback to misc-cache.
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NODESET;
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = 0;
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodesetval = xmlXPathNodeSetCreate(val);
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewNodeSet(val));
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewCString:
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the char * value
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewCString().
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val)
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->stringObjs != NULL) &&
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->stringObjs->number != 0))
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->stringObjs->items[--cache->stringObjs->number];
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = xmlStrdup(BAD_CAST val);
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = xmlStrdup(BAD_CAST val);
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewCString(val));
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewString:
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewString().
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val)
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->stringObjs != NULL) &&
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->stringObjs->number != 0))
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->stringObjs->items[--cache->stringObjs->number];
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val != NULL)
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup(val);
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup((const xmlChar *)"");
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_STRING;
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val != NULL)
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup(val);
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->stringval = xmlStrdup((const xmlChar *)"");
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewString(val));
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewBoolean:
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the boolean value
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewBoolean().
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type boolean and of value @val
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val)
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->cache)) {
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->booleanObjs != NULL) &&
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->booleanObjs->number != 0))
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->booleanObjs->items[--cache->booleanObjs->number];
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_BOOLEAN;
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = (val != 0);
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN);
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_BOOLEAN;
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = (val != 0);
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN);
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewBoolean(val));
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewFloat:
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the double value
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewFloat().
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type double and of value @val
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object.
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val)
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     if ((ctxt != NULL) && (ctxt->cache)) {
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cache->numberObjs != NULL) &&
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->numberObjs->number != 0))
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->numberObjs->items[--cache->numberObjs->number];
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NUMBER;
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->floatval = val;
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER);
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((cache->miscObjs != NULL) &&
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cache->miscObjs->number != 0))
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr ret;
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (xmlXPathObjectPtr)
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cache->miscObjs->items[--cache->miscObjs->number];
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->type = XPATH_NUMBER;
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->floatval = val;
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER);
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNewFloat(val));
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertString:
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertString().
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (cached)
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         (or the operation is done directly on @val)
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) {
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *res = NULL;
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewCString(ctxt, ""));
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n");
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNodeSetToString(val->nodesetval);
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastBooleanToString(val->boolval);
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNumberToString(val->floatval);
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt, val);
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res == NULL)
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewCString(ctxt, ""));
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCacheWrapString(ctxt, res));
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheObjectCopy:
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the original object
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathObjectCopy().
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire a copy of a given object
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused created object.
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val)
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (XP_HAS_CACHE(ctxt)) {
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (val->type) {
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheWrapNodeSet(ctxt,
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetMerge(NULL, val->nodesetval)));
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheNewString(ctxt, val->stringval));
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheNewBoolean(ctxt, val->boolval));
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathCacheNewFloat(ctxt, val->floatval));
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathObjectCopy(val));
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertBoolean:
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertBoolean().
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) {
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewBoolean(ctxt, 0));
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_BOOLEAN)
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val));
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt, val);
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertNumber:
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertNumber().
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) {
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCacheNewFloat(ctxt, 0.0));
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_NUMBER)
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val));
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt, val);
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Parser stacks related functions and macros		*
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePop:
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath evaluation context
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top XPath object from the value stack
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the XPath object just removed
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePop(xmlXPathParserContextPtr ctxt)
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->valueNr <= 0))
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->valueNr--;
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueNr > 0)
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value = ctxt->valueTab[ctxt->valueNr - 1];
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value = NULL;
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->valueTab[ctxt->valueNr];
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->valueTab[ctxt->valueNr] = NULL;
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePush:
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath evaluation context
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the XPath object
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new XPath object on top of the value stack
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the number of items on the value stack
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value)
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (value == NULL)) return(-1);
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueNr >= ctxt->valueMax) {
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathObjectPtr *tmp;
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab,
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             2 * ctxt->valueMax *
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             sizeof(ctxt->valueTab[0]));
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "realloc failed !\n");
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->valueMax *= 2;
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueTab = tmp;
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->valueTab[ctxt->valueNr] = value;
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value = value;
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->valueNr++);
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopBoolean:
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a boolean from the stack, handling conversion if needed.
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) {
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) {
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->type != XPATH_BOOLEAN)
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastToBoolean(obj);
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = obj->boolval;
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNumber:
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a number from the stack, handling conversion if needed.
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNumber (xmlXPathParserContextPtr ctxt) {
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) {
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->type != XPATH_NUMBER)
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastToNumber(obj);
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = obj->floatval;
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopString:
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a string from the stack, handling conversion if needed.
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopString (xmlXPathParserContextPtr ctxt) {
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar * ret;
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) {
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCastToString(obj);	/* this does required strdup */
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: needs refactoring somewhere else */
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->stringval == ret)
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj->stringval = NULL;
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNodeSet:
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a node-set from the stack, handling conversion if needed.
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node-set
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) {
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return(NULL);
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL) {
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlXPathStackIsNodeSet(ctxt)) {
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetTypeError(ctxt);
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = obj->nodesetval;
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* to fix memory leak of not clearing obj->user */
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->boolval && obj->user != NULL)
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeNodeList((xmlNodePtr) obj->user);
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj->nodesetval = NULL;
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopExternal:
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an XPath parser context
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops an external object from the stack, handling conversion if needed.
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError.
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the object
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid *
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopExternal (xmlXPathParserContextPtr ctxt) {
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void * ret;
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->value == NULL)) {
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value->type != XPATH_USERS) {
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathSetTypeError(ctxt);
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = obj->user;
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj->user = NULL;
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macros for accessing the content. Those should be used only by the parser,
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and not exported.
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dirty macros, i.e. one need to make assumption on the context to use them
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CUR_PTR return the current pointer to the xmlChar to be parsed.
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CUR     returns the current xmlChar value, i.e. a 8 bit value
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           in ISO-Latin or UTF-8.
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           This should be used internally by the parser
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           only to compare to ASCII values otherwise it would break when
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           running with UTF-8 encoding.
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   NXT(n)  returns the n'th next xmlChar. Same as CUR is should be used only
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           to compare on ASCII based substring.
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           strings within the parser.
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CURRENT Returns the current char value, with the full decoding of
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           UTF-8 if we are using this mode. It returns an int.
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   NEXT    Skip to the next character, this does the proper decoding
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           in UTF-8 mode. It also pop-up unfinished entities on the fly.
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *           It returns the pointer to the current xmlChar.
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur)
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->cur += (val)
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->cur[(val)]
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->cur
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l)
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define COPY_BUF(l,b,i,v)                                              \
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (l == 1) b[i++] = (xmlChar) v;                                  \
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else i += xmlCopyChar(l,&b[i],v)
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l)  ctxt->cur += l
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS 							\
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*(ctxt->cur))) NEXT
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT (*ctxt->cur)
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ((*ctxt->cur) ?  ctxt->cur++: ctxt->cur)
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_DIG
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_DIG 16
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_EPSILON
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_EPSILON 1E-9
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UPPER_DOUBLE 1E9
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LOWER_DOUBLE 1E-5
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define	LOWER_DOUBLE_EXP 5
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INTEGER_DIGITS DBL_DIG
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP))
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EXPONENT_DIGITS (3 + 2)
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFormatNumber:
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @number:     number to format
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:     output buffer
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffersize: size of output buffer
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the number into a string representation.
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFormatNumber(double number, char buffer[], int buffersize)
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (xmlXPathIsInf(number)) {
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 1:
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffersize > (int)sizeof("Infinity"))
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "Infinity");
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case -1:
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffersize > (int)sizeof("-Infinity"))
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "-Infinity");
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    default:
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(number)) {
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (buffersize > (int)sizeof("NaN"))
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(buffer, buffersize, "NaN");
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (number == 0 && xmlXPathGetSign(number) != 0) {
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "0");
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (number == ((int) number)) {
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char work[30];
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *ptr, *cur;
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int value = (int) number;
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ptr = &buffer[0];
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value == 0) {
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ptr++ = '0';
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(work, 29, "%d", value);
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = &work[0];
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*cur) && (ptr - buffer < buffersize)) {
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *ptr++ = *cur++;
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ptr - buffer < buffersize) {
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ptr = 0;
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (buffersize > 0) {
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ptr--;
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ptr = 0;
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      For the dimension of work,
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	          DBL_DIG is number of significant digits
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  EXPONENT is only needed for "scientific notation"
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	          3 is sign, decimal point, and terminating zero
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  LOWER_DOUBLE_EXP is max number of leading zeroes in fraction
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      Note that this dimension is slightly (a few characters)
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      larger than actually necessary.
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char work[DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP];
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int integer_place, fraction_place;
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *ptr;
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *after_fraction;
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    double absolute_value;
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int size;
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    absolute_value = fabs(number);
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * First choose format - scientific or regular floating point.
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * In either case, result is in work, and after_fraction points
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * just past the fractional part.
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ((absolute_value > UPPER_DOUBLE) ||
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (absolute_value < LOWER_DOUBLE)) &&
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (absolute_value != 0.0) ) {
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Use scientific notation */
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fraction_place = DBL_DIG - 1;
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = snprintf(work, sizeof(work),"%*.*e",
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 integer_place, fraction_place, number);
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((size > 0) && (work[size] != 'e')) size--;
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Use regular notation */
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (absolute_value > 0.0) {
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    integer_place = (int)log10(absolute_value);
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (integer_place > 0)
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        fraction_place = DBL_DIG - integer_place - 1;
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        fraction_place = DBL_DIG - integer_place;
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fraction_place = 1;
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = snprintf(work, sizeof(work), "%0.*f",
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				fraction_place, number);
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove fractional trailing zeroes */
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    after_fraction = work + size;
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ptr = after_fraction;
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (*(--ptr) == '0')
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		;
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*ptr != '.')
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ptr++;
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*ptr++ = *after_fraction++) != 0);
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Finally copy result back to caller */
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    size = strlen(work) + 1;
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (size > buffersize) {
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		work[buffersize - 1] = 0;
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = buffersize;
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memmove(buffer, work, size);
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Routines to handle NodeSets			*
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathOrderDocElems:
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  an input document
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Call this routine to speed up XPath computation on static documents.
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This stamps all the element nodes with the document order
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Like for line information, the order is kept in the element->content
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field, the value stored is actually - the node number (starting at -1)
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be able to differentiate from line numbers.
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of elements found in the document or -1 in case
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    of error.
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectlong
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathOrderDocElems(xmlDocPtr doc) {
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long count = 0;
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = doc->children;
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->type == XML_ELEMENT_NODE) {
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur->content = (void *) (-(++count));
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->children != NULL) {
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->children;
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->next != NULL) {
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->parent;
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == NULL)
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == (xmlNodePtr) doc) {
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = NULL;
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->next != NULL) {
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(count);
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodes:
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1:  the first node
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2:  the second node
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it's the same node, -1 otherwise
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth1, depth2;
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int attr1 = 0, attr2 = 0;
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr attrNode1 = NULL, attrNode2 = NULL;
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, root;
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1 == NULL) || (node2 == NULL))
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a couple of optimizations which will avoid computations in most cases
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2)		/* trivial case */
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1->type == XML_ATTRIBUTE_NODE) {
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr1 = 1;
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrNode1 = node1;
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node2->type == XML_ATTRIBUTE_NODE) {
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr2 = 1;
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrNode2 = node2;
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2) {
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr1 == attr2) {
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* not required, but we keep attributes in order */
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr1 != 0) {
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        cur = attrNode2->prev;
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur == attrNode1)
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return (1);
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->prev;
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr2 == 1)
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_NAMESPACE_DECL) ||
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (node2->type == XML_NAMESPACE_DECL))
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node1->doc == node2->doc)) {
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	long l1, l2;
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * compute depth to root
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) {
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node1)
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2++;
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = cur;
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) {
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1++;
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Distinct document (or distinct entities :-( ) case.
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root != cur) {
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * get the nearest common ancestor.
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth1 > depth2) {
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1--;
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth2 > depth1) {
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2--;
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node1->parent != node2->parent) {
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* should not happen but just in case ... */
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((node1 == NULL) || (node2 == NULL))
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-2);
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Find who's first.
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node1->doc == node2->doc)) {
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	long l1, l2;
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = node1->next;cur != NULL;cur = cur->next)
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1); /* assume there is no sibling list corruption */
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodesExt:
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1:  the first node
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2:  the second node
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order.
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is optimized for handling of non-element nodes.
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it's the same node, -1 otherwise
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth1, depth2;
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int misc = 0, precedence1 = 0, precedence2 = 0;
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr miscNode1 = NULL, miscNode2 = NULL;
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, root;
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long l1, l2;
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1 == NULL) || (node2 == NULL))
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2)
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a couple of optimizations which will avoid computations in most cases
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node1->type) {
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node2->type == XML_ELEMENT_NODE) {
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (0 > (long) node2->content) &&
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (node1->doc == node2->doc))
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    l1 = -((long) node1->content);
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    l2 = -((long) node2->content);
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (l1 < l2)
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (l1 > l2)
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto turtle_comparison;
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    precedence1 = 1; /* element is owner */
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode1 = node1;
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node1 = node1->parent;
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    misc = 1;
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE: {
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode1 = node1;
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Find nearest element node.
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node1->prev != NULL) {
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node1 = node1->prev;
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node1->type == XML_ELEMENT_NODE) {
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence1 = 3; /* element in prev-sibl axis */
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node1->prev == NULL) {
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence1 = 2; /* element is parent */
3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* URGENT TODO: Are there any cases, where the
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* parent of such a node is not an element node?
3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			node1 = node1->parent;
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (1);
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence1 = 2; /* element is parent */
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node1 = node1->parent;
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) ||
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(0 <= (long) node1->content)) {
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Fallback for whatever case.
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node1 = miscNode1;
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence1 = 0;
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		misc = 1;
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: why do we return 1 for namespace nodes?
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node2->type) {
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    precedence2 = 1; /* element is owner */
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode2 = node2;
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node2 = node2->parent;
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    misc = 1;
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE: {
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    miscNode2 = node2;
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node2->prev != NULL) {
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node2 = node2->prev;
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node2->type == XML_ELEMENT_NODE) {
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence2 = 3; /* element in prev-sibl axis */
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (node2->prev == NULL) {
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			precedence2 = 2; /* element is parent */
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			node2 = node2->parent;
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (1);
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence2 = 2; /* element is parent */
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node2 = node2->parent;
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) ||
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(0 <= (long) node1->content))
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node2 = miscNode2;
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		precedence2 = 0;
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		misc = 1;
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (misc) {
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node1 == node2) {
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (precedence1 == precedence2) {
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The ugly case; but normally there aren't many
3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* adjacent non-element nodes around.
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = miscNode2->prev;
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur == miscNode1)
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->type == XML_ELEMENT_NODE)
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->prev;
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Evaluate based on higher precedence wrt to the element.
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: This assumes attributes are sorted before content.
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   Is this 100% correct?
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (precedence1 < precedence2)
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Special case: One of the helper-elements is contained by the other.
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <foo>
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   <node2>
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*     <node1>Text-1(precedence1 == 2)</node1>
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   </node2>
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   Text-6(precedence2 == 3)
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* </foo>
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((precedence2 == 3) && (precedence1 > 1)) {
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = node1->parent;
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur) {
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur == node2)
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->parent;
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((precedence1 == 3) && (precedence2 > 1)) {
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = node2->parent;
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur) {
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur == node1)
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->parent;
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node1->doc == node2->doc)) {
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectturtle_comparison:
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * compute depth to root
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) {
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node1)
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2++;
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = cur;
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) {
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1++;
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Distinct document (or distinct entities :-( ) case.
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root != cur) {
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * get the nearest common ancestor.
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth1 > depth2) {
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth1--;
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (depth2 > depth1) {
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth2--;
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node1->parent != node2->parent) {
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node1 = node1->parent;
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node2 = node2->parent;
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* should not happen but just in case ... */
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((node1 == NULL) || (node2 == NULL))
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-2);
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Find who's first.
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->prev)
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node1 == node2->next)
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Speedup using document order if availble.
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node1->type == XML_ELEMENT_NODE) &&
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node2->type == XML_ELEMENT_NODE) &&
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node1->content) &&
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(0 > (long) node2->content) &&
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node1->doc == node2->doc)) {
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l1 = -((long) node1->content);
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	l2 = -((long) node2->content);
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 < l2)
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (l1 > l2)
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = node1->next;cur != NULL;cur = cur->next)
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node2)
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1); /* assume there is no sibling list corruption */
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetSort:
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set:  the node set
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sort the node set in document order
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetSort(xmlNodeSetPtr set) {
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, incr, len;
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp;
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set == NULL)
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Use Shell's sort to sort the node-set */
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = set->nodeNr;
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (incr = len / 2; incr > 0; incr /= 2) {
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = incr; i < len; i++) {
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    j = i - incr;
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (j >= 0) {
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlXPathCmpNodesExt(set->nodeTab[j],
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set->nodeTab[j + incr]) == -1)
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlXPathCmpNodes(set->nodeTab[j],
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set->nodeTab[j + incr]) == -1)
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = set->nodeTab[j];
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeTab[j] = set->nodeTab[j + incr];
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeTab[j + incr] = tmp;
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    j -= incr;
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NODESET_DEFAULT	10
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDupNs:
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the parent node of the namespace XPath node
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the libxml namespace declaration node.
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace node in libxml don't match the XPath semantic. In a node set
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic.
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) {
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNsPtr cur;
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL))
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((xmlNodePtr) ns);
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate a new Namespace and fill the fields.
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "duplicating namespace\n");
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(cur, 0, sizeof(xmlNs));
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->type = XML_NAMESPACE_DECL;
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns->href != NULL)
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->href = xmlStrdup(ns->href);
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns->prefix != NULL)
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->prefix = xmlStrdup(ns->prefix);
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->next = (xmlNsPtr) node;
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlNodePtr) cur);
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetFreeNs:
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the XPath namespace node found in a nodeset.
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace nodes in libxml don't match the XPath semantic. In a node set
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic. Check if such a node needs to be freed
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetFreeNs(xmlNsPtr ns) {
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL))
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) {
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns->href != NULL)
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar *)ns->href);
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns->prefix != NULL)
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar *)ns->prefix);
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ns);
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreate:
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an initial xmlNodePtr, or NULL
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreate(xmlNodePtr val) {
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating nodeset\n");
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlNodeSet));
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL) {
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->nodeTab == NULL) {
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "creating nodeset\n");
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(ret->nodeTab, 0 ,
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nodeMax = XML_NODESET_DEFAULT;
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val->type == XML_NAMESPACE_DECL) {
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) val;
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodeTab[ret->nodeNr++] =
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodeTab[ret->nodeNr++] = val;
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreateSize:
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the initial size of the set
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreateSize(int size) {
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating nodeset\n");
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlNodeSet));
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (size < XML_NODESET_DEFAULT)
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	size = XML_NODESET_DEFAULT;
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr));
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->nodeTab == NULL) {
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(NULL, "creating nodeset\n");
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr));
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodeMax = size;
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetContains:
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the node-set
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the node
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * checks whether @cur contains @val
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @cur contains @val, false (0) otherwise
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) {
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return(0);
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XML_NAMESPACE_DECL) {
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < cur->nodeNr; i++) {
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) {
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns1, ns2;
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns1 = (xmlNsPtr) val;
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns2 = (xmlNsPtr) cur->nodeTab[i];
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ns1 == ns2)
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ns1->next != NULL) && (ns2->next == ns1->next) &&
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            (xmlStrEqual(ns1->prefix, ns2->prefix)))
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < cur->nodeNr; i++) {
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodeTab[i] == val)
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddNs:
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the hosting node
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a the namespace node
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new namespace node to an existing NodeSet
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) {
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (ns == NULL) || (node == NULL) ||
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ns->type != XML_NAMESPACE_DECL) ||
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node->type != XML_ELEMENT_NODE))
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * prevent duplicates
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->nodeNr;i++) {
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->nodeTab[i] != NULL) &&
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) &&
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) &&
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix)))
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the nodeTab if needed
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nodeMax == 0) {
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->nodeTab == NULL) {
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->nodeTab, 0 ,
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax = XML_NODESET_DEFAULT;
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->nodeNr == cur->nodeMax) {
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr *temp;
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax *= 2;
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax *
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlNodePtr));
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab = temp;
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns);
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAdd:
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a new xmlNodePtr
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) {
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return;
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' '))
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;	/* an XSLT fake node */
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * prevent duplcates
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->nodeNr;i++)
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->nodeTab[i] == val) return;
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the nodeTab if needed
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nodeMax == 0) {
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->nodeTab == NULL) {
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->nodeTab, 0 ,
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax = XML_NODESET_DEFAULT;
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->nodeNr == cur->nodeMax) {
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr *temp;
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax *= 2;
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax *
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlNodePtr));
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab = temp;
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XML_NAMESPACE_DECL) {
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr ns = (xmlNsPtr) val;
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab[cur->nodeNr++] =
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab[cur->nodeNr++] = val;
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddUnique:
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a new xmlNodePtr
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet, optimized version
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when we are sure the node is not already in the set.
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) {
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (val == NULL)) return;
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' '))
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;	/* an XSLT fake node */
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * grow the nodeTab if needed
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nodeMax == 0) {
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->nodeTab == NULL) {
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(cur->nodeTab, 0 ,
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax = XML_NODESET_DEFAULT;
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur->nodeNr == cur->nodeMax) {
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr *temp;
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeMax *= 2;
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax *
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sizeof(xmlNodePtr));
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathErrMemory(NULL, "growing nodeset\n");
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab = temp;
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XML_NAMESPACE_DECL) {
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr ns = (xmlNsPtr) val;
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab[cur->nodeNr++] =
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->nodeTab[cur->nodeNr++] = val;
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMerge:
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1:  the first NodeSet or NULL
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2:  the second NodeSet
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error.
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, initNr, skip;
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr n1, n2;
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val2 == NULL) return(val1);
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val1 == NULL) {
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathNodeSetCreate(NULL);
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: The optimization won't work in every case, since
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  those nasty namespace nodes need to be added with
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  xmlXPathNodeSetDupNs() to the set; thus a pure
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  memcpy is not possible.
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  If there was a flag on the nodesetval, indicating that
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  some temporary nodes are in, that would be helpfull.
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Optimization: Create an equally sized node-set
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and memcpy the content.
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathNodeSetCreateSize(val2->nodeNr);
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val1 == NULL)
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val2->nodeNr != 0) {
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val2->nodeNr == 1)
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*(val1->nodeTab) = *(val2->nodeTab);
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memcpy(val1->nodeTab, val2->nodeTab,
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val2->nodeNr * sizeof(xmlNodePtr));
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeNr = val2->nodeNr;
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val1);
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    initNr = val1->nodeNr;
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < val2->nodeNr;i++) {
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	n2 = val2->nodeTab[i];
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * check against duplicates
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	skip = 0;
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0; j < initNr; j++) {
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    n1 = val1->nodeTab[j];
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n1 == n2) {
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		skip = 1;
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((n1->type == XML_NAMESPACE_DECL) &&
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       (n2->type == XML_NAMESPACE_DECL)) {
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) &&
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlStrEqual(((xmlNsPtr) n1)->prefix,
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlNsPtr) n2)->prefix)))
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    skip = 1;
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (skip)
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * grow the nodeTab if needed
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val1->nodeMax == 0) {
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    sizeof(xmlNodePtr));
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val1->nodeTab == NULL) {
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(val1->nodeTab, 0 ,
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax = XML_NODESET_DEFAULT;
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (val1->nodeNr == val1->nodeMax) {
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr *temp;
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax *= 2;
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax *
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (temp == NULL) {
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = temp;
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (n2->type == XML_NAMESPACE_DECL) {
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) n2;
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] =
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] = n2;
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val1);
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* xmlXPathNodeSetMergeUnique() is currently not used anymore */
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeUnique:
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1:  the first NodeSet or NULL
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2:  the second NodeSet
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error.
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val2 == NULL) return(val1);
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val1 == NULL) {
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathNodeSetCreate(NULL);
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < val2->nodeNr;i++) {
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * grow the nodeTab if needed
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val1->nodeMax == 0) {
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    sizeof(xmlNodePtr));
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val1->nodeTab == NULL) {
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(val1->nodeTab, 0 ,
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax = XML_NODESET_DEFAULT;
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (val1->nodeNr == val1->nodeMax) {
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr *temp;
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeMax *= 2;
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax *
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     sizeof(xmlNodePtr));
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (temp == NULL) {
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathErrMemory(NULL, "merging nodeset\n");
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab = temp;
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) {
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i];
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] =
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i];
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val1);
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* xmlXPathNodeSetMergeUnique() is currently not used anymore */
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClear:
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1:  the first NodeSet or NULL
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2:  the second NodeSet
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2.
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for duplicate nodes. Clears set2.
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error.
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2,
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int hasNullEntries)
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set1 == NULL) && (hasNullEntries == 0)) {
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that doing a memcpy of the list, namespace nodes are
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* just assigned to set1, since set2 is cleared anyway.
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set1 = xmlXPathNodeSetCreateSize(set2->nodeNr);
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set2->nodeNr != 0) {
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memcpy(set1->nodeTab, set2->nodeTab,
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set2->nodeNr * sizeof(xmlNodePtr));
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1->nodeNr = set2->nodeNr;
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, initNbSet1;
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr n1, n2;
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    	set1 = xmlXPathNodeSetCreate(NULL);
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	initNbSet1 = set1->nodeNr;
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < set2->nodeNr;i++) {
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    n2 = set2->nodeTab[i];
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip NULLed entries.
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n2 == NULL)
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip duplicates.
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < initNbSet1; j++) {
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		n1 = set1->nodeTab[j];
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (n1 == n2) {
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto skip_node;
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((n1->type == XML_NAMESPACE_DECL) &&
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (n2->type == XML_NAMESPACE_DECL))
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) &&
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlStrEqual(((xmlNsPtr) n1)->prefix,
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlNsPtr) n2)->prefix)))
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Free the namespace node.
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set2->nodeTab[i] = NULL;
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathNodeSetFreeNs((xmlNsPtr) n2);
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto skip_node;
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * grow the nodeTab if needed
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set1->nodeMax == 0) {
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = (xmlNodePtr *) xmlMalloc(
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * sizeof(xmlNodePtr));
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (set1->nodeTab == NULL) {
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memset(set1->nodeTab, 0,
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeMax = XML_NODESET_DEFAULT;
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (set1->nodeNr >= set1->nodeMax) {
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr *temp;
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeMax *= 2;
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		temp = (xmlNodePtr *) xmlRealloc(
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set1->nodeTab, set1->nodeMax * sizeof(xmlNodePtr));
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (temp == NULL) {
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = temp;
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n2->type == XML_NAMESPACE_DECL) {
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = (xmlNsPtr) n2;
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab[set1->nodeNr++] =
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab[set1->nodeNr++] = n2;
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectskip_node:
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {}
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set2->nodeNr = 0;
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(set1);
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClearNoDupls:
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1:  the first NodeSet or NULL
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2:  the second NodeSet
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2.
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Doesn't chack for duplicate nodes. Clears set2.
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error.
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2,
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    int hasNullEntries)
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (set2 == NULL)
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(set1);
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set1 == NULL) && (hasNullEntries == 0)) {
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that doing a memcpy of the list, namespace nodes are
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* just assigned to set1, since set2 is cleared anyway.
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set1 = xmlXPathNodeSetCreateSize(set2->nodeNr);
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set2->nodeNr != 0) {
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memcpy(set1->nodeTab, set2->nodeTab,
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set2->nodeNr * sizeof(xmlNodePtr));
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1->nodeNr = set2->nodeNr;
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr n2;
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (set1 == NULL)
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1 = xmlXPathNodeSetCreate(NULL);
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < set2->nodeNr;i++) {
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    n2 = set2->nodeTab[i];
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip NULLed entries.
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (n2 == NULL)
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set1->nodeMax == 0) {
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = (xmlNodePtr *) xmlMalloc(
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * sizeof(xmlNodePtr));
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (set1->nodeTab == NULL) {
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memset(set1->nodeTab, 0,
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeMax = XML_NODESET_DEFAULT;
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (set1->nodeNr >= set1->nodeMax) {
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr *temp;
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeMax *= 2;
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		temp = (xmlNodePtr *) xmlRealloc(
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set1->nodeTab, set1->nodeMax * sizeof(xmlNodePtr));
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (temp == NULL) {
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(NULL, "merging nodeset\n");
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set1->nodeTab = temp;
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set1->nodeTab[set1->nodeNr++] = n2;
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set2->nodeNr = 0;
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(set1);
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDel:
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an xmlNodePtr
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an xmlNodePtr from an existing NodeSet
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) {
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return;
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) return;
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * find node in nodeTab
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < cur->nodeNr;i++)
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->nodeTab[i] == val) break;
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (i >= cur->nodeNr) {	/* not found */
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n",
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val->name);
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodeTab[i] != NULL) &&
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->nodeTab[i]->type == XML_NAMESPACE_DECL))
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]);
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeNr--;
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (;i < cur->nodeNr;i++)
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab[i] = cur->nodeTab[i + 1];
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeTab[cur->nodeNr] = NULL;
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetRemove:
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the initial node set
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the index to remove
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an entry from an existing NodeSet list.
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) {
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return;
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val >= cur->nodeNr) return;
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodeTab[val] != NULL) &&
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->nodeTab[val]->type == XML_NAMESPACE_DECL))
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]);
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeNr--;
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (;val < cur->nodeNr;val++)
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->nodeTab[val] = cur->nodeTab[val + 1];
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->nodeTab[cur->nodeNr] = NULL;
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSet:
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlNodeSetPtr to free
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound (not the actual nodes !).
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSet(xmlNodeSetPtr obj) {
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeTab != NULL) {
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* @@ with_ns to check whether namespace nodes should be looked at @@ */
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < obj->nodeNr;i++)
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((obj->nodeTab[i] != NULL) &&
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(obj->nodeTab[i]->type == XML_NAMESPACE_DECL))
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj->nodeTab);
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClear:
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set:  the node set to clear
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from all temporary XPath objects (e.g. namespace nodes
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed), but does *not* free the list itself. Sets the length of the
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * list to 0.
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes)
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set == NULL) || (set->nodeNr <= 0))
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (hasNsNodes) {
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr node;
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < set->nodeNr; i++) {
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = set->nodeTab[i];
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node != NULL) &&
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(node->type == XML_NAMESPACE_DECL))
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetFreeNs((xmlNsPtr) node);
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set->nodeNr = 0;
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClearFromPos:
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set to be cleared
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pos: the start position to clear from
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from temporary XPath objects (e.g. namespace nodes
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed) starting with the entry at @pos, but does *not* free the list
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * itself. Sets the length of the list to @pos.
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes)
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr))
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((hasNsNodes)) {
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr node;
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = pos; i < set->nodeNr; i++) {
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = set->nodeTab[i];
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((node != NULL) &&
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(node->type == XML_NAMESPACE_DECL))
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetFreeNs((xmlNsPtr) node);
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    set->nodeNr = pos;
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeValueTree:
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlNodeSetPtr to free
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound and the actual tree, this is different
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from xmlXPathFreeNodeSet()
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj) {
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeTab != NULL) {
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < obj->nodeNr;i++) {
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodeTab[i] != NULL) {
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) {
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFreeNodeList(obj->nodeTab[i]);
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj->nodeTab);
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(DEBUG) || defined(DEBUG_STEP)
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGenericErrorContextNodeSet:
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  a FILE * for the output
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlNodeSetPtr to display
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Quick display of a NodeSet
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) {
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL) output = xmlGenericErrorContext;
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL)  {
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "NodeSet == NULL !\n");
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeNr == 0) {
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "NodeSet is empty\n");
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj->nodeTab == NULL) {
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " nodeTab == NULL !\n");
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < obj->nodeNr; i++) {
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (obj->nodeTab[i] == NULL) {
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " NULL !\n");
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) ||
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE))
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " /");
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (obj->nodeTab[i]->name == NULL)
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " noname!");
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else fprintf(output, " %s", obj->nodeTab[i]->name);
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSet:
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSet(xmlNodePtr val) {
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating nodeset\n");
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_NODESET;
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->boolval = 0;
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodesetval = xmlXPathNodeSetCreate(val);
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @@ with_ns to check whether namespace nodes should be looked at @@ */
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET);
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewValueTree:
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the tree root @val
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewValueTree(xmlNodePtr val) {
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating result value tree\n");
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_XSLT_TREE;
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->boolval = 1;
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = (void *) val;
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodesetval = xmlXPathNodeSetCreate(val);
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE);
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSetList:
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an existing NodeSet
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the Nodeset @val
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSetList(xmlNodeSetPtr val)
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = NULL;
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (val->nodeTab == NULL)
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlXPathNewNodeSet(NULL);
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlXPathNewNodeSet(val->nodeTab[0]);
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 1; i < val->nodeNr; ++i)
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]);
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapNodeSet:
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the NodePtr value
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapNodeSet(xmlNodeSetPtr val) {
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating node set object\n");
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_NODESET;
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodesetval = val;
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET);
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSetList:
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  an existing NodeSetList object
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the list contrary to xmlXPathFreeObject().
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) {
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageReleased(NULL, obj->type);
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDifference:
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets difference() function:
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:difference (node-set, node-set)
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the difference between the two node sets, or nodes1 if
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         nodes2 is empty
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l1;
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l1 = xmlXPathNodeSetGetLength(nodes1);
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l1; i++) {
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes1, i);
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!xmlXPathNodeSetContains(nodes2, cur))
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique(ret, cur);
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIntersection:
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets intersection() function:
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:intersection (node-set, node-set)
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node set comprising the nodes that are within both the
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         node sets passed as arguments
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l1;
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l1 = xmlXPathNodeSetGetLength(nodes1);
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l1; i++) {
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes1, i);
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathNodeSetContains(nodes2, cur))
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique(ret, cur);
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinctSorted:
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set, sorted by document order
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function:
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:distinct (node-set)
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it is empty
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinctSorted (xmlNodeSetPtr nodes) {
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr hash;
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar * strval;
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes))
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes);
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hash = xmlHashCreate (l);
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l; i++) {
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes, i);
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	strval = xmlXPathCastNodeToString(cur);
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlHashLookup(hash, strval) == NULL) {
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlHashAddEntry(hash, strval, strval);
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique(ret, cur);
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(strval);
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(hash, (xmlHashDeallocator) xmlFree);
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinct:
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function:
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:distinct (node-set)
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsDistinctSorted
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called with the sorted node-set
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         it is empty
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinct (xmlNodeSetPtr nodes) {
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes))
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes);
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathDistinctSorted(nodes));
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathHasSameNodes:
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets has-same-nodes function:
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean set:has-same-node(node-set, node-set)
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @nodes1 shares any node with @nodes2, false (0)
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         otherwise
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1) ||
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetIsEmpty(nodes2))
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes1);
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l; i++) {
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes1, i);
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathNodeSetContains(nodes2, cur))
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeadingSorted:
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order,
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) {
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes) ||
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlXPathNodeSetContains(nodes, node)))
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes);
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < l; i++) {
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes, i);
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node)
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetAddUnique(ret, cur);
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeading:
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called.
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order,
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) {
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes);
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeLeadingSorted(nodes, node));
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeadingSorted:
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set, sorted by document order
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set, sorted by document order
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeLeadingSorted(nodes1,
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlXPathNodeSetItem(nodes2, 1)));
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeading:
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function:
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:leading (node-set, node-set)
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #exslSetsLeadingSorted is called.
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNodeSetCreate(NULL));
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes1);
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes2);
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeLeadingSorted(nodes1,
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlXPathNodeSetItem(nodes2, 1)));
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailingSorted:
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order,
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) {
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l;
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes);
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes) ||
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlXPathNodeSetContains(nodes, node)))
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    l = xmlXPathNodeSetGetLength(nodes);
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = l - 1; i >= 0; i--) {
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlXPathNodeSetItem(nodes, i);
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == node)
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetAddUnique(ret, cur);
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(ret);	/* bug 413451 */
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailing:
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  a node-set
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called.
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order,
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @nodes if @node is NULL or an empty node-set if @nodes
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         doesn't contain @node
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) {
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes);
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeTrailingSorted(nodes, node));
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailingSorted:
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set, sorted by document order
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set, sorted by document order
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2
4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeTrailingSorted(nodes1,
4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlXPathNodeSetItem(nodes2, 0)));
4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailing:
4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1:  a node-set
4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2:  a node-set
4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function:
4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set set:trailing (node-set, node-set)
4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then
4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #xmlXPathTrailingSorted is called.
4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2
4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in document order, @nodes1 if @nodes2 is NULL or empty or
4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         an empty node-set if @nodes1 doesn't contain @nodes2
4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr
4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes2))
4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nodes1);
4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathNodeSetIsEmpty(nodes1))
4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNodeSetCreate(NULL));
4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes1);
4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetSort(nodes2);
4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNodeTrailingSorted(nodes1,
4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlXPathNodeSetItem(nodes2, 0)));
4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Routines to handle extra functions			*
4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFunc:
4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the function implementation or NULL
4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function
4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name,
4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlXPathFunction f) {
4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f));
4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncNS:
4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the function namespace URI
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the function implementation or NULL
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *ns_uri, xmlXPathFunction f) {
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcHash == NULL)
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->funcHash = xmlHashCreate(0);
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcHash == NULL)
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (f == NULL)
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL));
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, XML_CAST_FPTR(f)));
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncLookup:
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the lookup function
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @funcCtxt:  the lookup data
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers an external mechanism to do function lookup.
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFuncLookupFunc f,
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    void *funcCtxt) {
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->funcLookupFunc = f;
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->funcLookupData = funcCtxt;
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookup:
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function.
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) {
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcLookupFunc != NULL) {
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFunction ret;
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFuncLookupFunc f;
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	f = ctxt->funcLookupFunc;
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = f(ctxt->funcLookupData, name, NULL);
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL)
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathFunctionLookupNS(ctxt, name, NULL));
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookupNS:
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the function name
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the function namespace URI
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function.
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *ns_uri) {
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFunction ret;
4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcLookupFunc != NULL) {
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFuncLookupFunc f;
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	f = ctxt->funcLookupFunc;
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = f(ctxt->funcLookupData, name, ns_uri);
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL)
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->funcHash == NULL)
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->funcHash, name, ns_uri);
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredFuncsCleanup:
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered functions
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) {
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(ctxt->funcHash, NULL);
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->funcHash = NULL;
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Routines to handle Variables			*
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariable:
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the variable value or NULL
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name,
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlXPathObjectPtr value) {
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value));
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableNS:
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the variable namespace URI
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the variable value or NULL
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *ns_uri,
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathObjectPtr value) {
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varHash == NULL)
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->varHash = xmlHashCreate(0);
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varHash == NULL)
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri,
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                           (xmlHashDeallocator)xmlXPathFreeObject));
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri,
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       (void *) value,
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       (xmlHashDeallocator)xmlXPathFreeObject));
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableLookup:
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the lookup function
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  the lookup data
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * register an external mechanism to do variable lookup
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt,
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlXPathVariableLookupFunc f, void *data) {
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->varLookupFunc = f;
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->varLookupData = data;
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookup:
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * variable value.
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a copy of the value or NULL if not found
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) {
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varLookupFunc != NULL) {
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr ret;
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (ctxt->varLookupData, name, NULL);
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathVariableLookupNS(ctxt, name, NULL));
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookupNS:
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the variable name
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the variable namespace URI
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * variable value.
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the a copy of the value or NULL if not found
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name,
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *ns_uri) {
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varLookupFunc != NULL) {
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr ret;
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (ctxt->varLookupData, name, ns_uri);
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL) return(ret);
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->varHash == NULL)
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr)
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlHashLookup2(ctxt->varHash, name, ns_uri)));
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredVariablesCleanup:
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) {
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject);
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->varHash = NULL;
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterNs:
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix:  the namespace prefix
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri:  the namespace name
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new namespace. If @ns_uri is NULL it unregisters
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix,
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *ns_uri) {
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix == NULL)
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nsHash == NULL)
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->nsHash = xmlHashCreate(10);
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nsHash == NULL)
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns_uri == NULL)
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlHashRemoveEntry(ctxt->nsHash, prefix,
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                          (xmlHashDeallocator)xmlFree));
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri),
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      (xmlHashDeallocator)xmlFree));
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNsLookup:
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix:  the namespace prefix value
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the namespace declaration array of the context for the given
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace name associated to the given prefix
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value or NULL if not found
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) {
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix == NULL)
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_XML_NAMESPACE
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(prefix, (const xmlChar *) "xml"))
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(XML_XML_NAMESPACE);
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->namespaces != NULL) {
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ctxt->nsNr;i++) {
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->namespaces[i] != NULL) &&
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlStrEqual(ctxt->namespaces[i]->prefix, prefix)))
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->namespaces[i]->href);
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix));
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredNsCleanup:
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) {
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree);
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nsHash = NULL;
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Routines to handle Values			*
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Allocations are terrible, one needs to optimize all this !!! */
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewFloat:
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the double value
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type double and of value @val
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewFloat(double val) {
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating float object\n");
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_NUMBER;
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->floatval = val;
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER);
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewBoolean:
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the boolean value
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type boolean and of value @val
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewBoolean(int val) {
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating boolean object\n");
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_BOOLEAN;
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->boolval = (val != 0);
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN);
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewString:
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewString(const xmlChar *val) {
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating string object\n");
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_STRING;
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->stringval = xmlStrdup(val);
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->stringval = xmlStrdup((const xmlChar *)"");
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapString:
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar * value
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object.
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapString (xmlChar *val) {
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating string object\n");
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_STRING;
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->stringval = val;
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCString:
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the char * value
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCString(const char *val) {
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating string object\n");
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_STRING;
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->stringval = xmlStrdup(BAD_CAST val);
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapCString:
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the char * value
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps a string into an XPath object.
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapCString (char * val) {
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapString((xmlChar *)(val)));
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapExternal:
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the user data
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val data into an XPath object.
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapExternal (void *val) {
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating user object\n");
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XPATH_USERS;
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = val;
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS);
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathObjectCopy:
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the original object
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate a new copy of a given object
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object.
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectCopy(xmlXPathObjectPtr val) {
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "copying object\n");
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, val , (size_t) sizeof(xmlXPathObject));
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageRequested(NULL, val->type);
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_BOOLEAN:
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER:
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->stringval = xmlStrdup(val->stringval);
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  this previous handling is no longer correct, and can cause some serious
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  problems (ref. bug 145547)
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((val->nodesetval != NULL) &&
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(val->nodesetval->nodeTab != NULL)) {
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr cur, tmp;
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDocPtr top;
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->boolval = 1;
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		top =  xmlNewDoc(NULL);
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		top->name = (char *)
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrdup(val->nodesetval->nodeTab[0]->name);
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->user = top;
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (top != NULL) {
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    top->doc = top;
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = val->nodesetval->nodeTab[0]->children;
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (cur != NULL) {
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = xmlDocCopyNode(cur, top, 1);
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAddChild((xmlNodePtr) top, tmp);
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->next;
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top);
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret->nodesetval = xmlXPathNodeSetCreate(NULL);
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Deallocate the copied tree value */
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval);
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Do not deallocate the copied tree value */
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->boolval = 0;
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlLocationSetPtr loc = val->user;
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc);
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_USERS:
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->user = val->user;
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_UNDEFINED:
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlXPathObjectCopy: unsupported type %d\n",
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val->type);
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeObject:
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the object to free
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathObjectPtr object.
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeObject(xmlXPathObjectPtr obj) {
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) return;
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) {
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->boolval) {
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->user != NULL) {
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathFreeNodeSet(obj->nodesetval);
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFreeNodeList((xmlNodePtr) obj->user);
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodesetval != NULL)
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeValueTree(obj->nodesetval);
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (obj->nodesetval != NULL)
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeNodeSet(obj->nodesetval);
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (obj->type == XPATH_LOCATIONSET) {
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->user != NULL)
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPtrFreeLocationSet(obj->user);
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (obj->type == XPATH_STRING) {
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->stringval != NULL)
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(obj->stringval);
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugObjUsageReleased(NULL, obj->type);
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(obj);
5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathReleaseObject:
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj:  the xmlXPathObjectPtr to free or to cache
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Depending on the state of the cache this frees the given
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object or stores it in the cache.
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj)
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj;
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n))
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL)
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->cache == NULL)) {
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlXPathFreeObject(obj);
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextCachePtr cache =
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathContextCachePtr) ctxt->cache;
5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (obj->type) {
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_XSLT_TREE:
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->nodesetval != NULL) {
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (obj->boolval) {
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    	/*
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* It looks like the @boolval is used for
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* evaluation if this an XSLT Result Tree Fragment.
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* TODO: Check if this assumption is correct.
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			obj->type = XPATH_XSLT_TREE; /* just for debugging */
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathFreeValueTree(obj->nodesetval);
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			obj->nodesetval = NULL;
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((obj->nodesetval->nodeMax <= 40) &&
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(XP_CACHE_WANTS(cache->nodesetObjs,
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					cache->maxNodeset)))
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_CACHE_ADD(cache->nodesetObjs, obj);
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto obj_cached;
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathFreeNodeSet(obj->nodesetval);
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			obj->nodesetval = NULL;
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->stringval != NULL)
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(obj->stringval);
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) {
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_CACHE_ADD(cache->stringObjs, obj);
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto obj_cached;
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) {
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_CACHE_ADD(cache->booleanObjs, obj);
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto obj_cached;
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) {
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_CACHE_ADD(cache->numberObjs, obj);
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto obj_cached;
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_LOCATIONSET:
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (obj->user != NULL) {
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPtrFreeLocationSet(obj->user);
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto free_obj;
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto free_obj;
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Fallback to adding to the misc-objects slot.
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) {
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_CACHE_ADD(cache->miscObjs, obj);
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto free_obj;
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectobj_cached:
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjUsageReleased(ctxt, obj->type);
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL) {
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodeSetPtr tmpset = obj->nodesetval;
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Due to those nasty ns-nodes, we need to traverse
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  the list and free the ns-nodes.
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * URGENT TODO: Check if it's actually slowing things down.
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Maybe we shouldn't try to preserve the list.
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpset->nodeNr > 1) {
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr node;
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < tmpset->nodeNr; i++) {
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node = tmpset->nodeTab[i];
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((node != NULL) &&
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(node->type == XML_NAMESPACE_DECL))
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathNodeSetFreeNs((xmlNsPtr) node);
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (tmpset->nodeNr == 1) {
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((tmpset->nodeTab[0] != NULL) &&
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL))
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]);
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpset->nodeNr = 0;
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(obj, 0, sizeof(xmlXPathObject));
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    obj->nodesetval = tmpset;
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(obj, 0, sizeof(xmlXPathObject));
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfree_obj:
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Cache is full; free the object.
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL)
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeNodeSet(obj->nodesetval);
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDebugObjUsageReleased(NULL, obj->type);
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(obj);
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Type Casting Routines				*
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToString:
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a boolean
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its string value.
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToString (int val) {
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val)
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "true");
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "false");
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToString:
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a number
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its string value.
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToString (double val) {
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (xmlXPathIsInf(val)) {
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 1:
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "Infinity");
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case -1:
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "-Infinity");
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    default:
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(val)) {
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "NaN");
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (val == 0 && xmlXPathGetSign(val) != 0) {
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "0");
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* could be improved */
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char buf[100];
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFormatNumber(val, buf, 99);
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    buf[99] = 0;
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) buf);
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToString:
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its string value.
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToString (xmlNodePtr node) {
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *ret;
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret = xmlNodeGetContent(node)) == NULL)
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStrdup((const xmlChar *) "");
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToString:
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a node-set
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its string value.
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string.
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToString (xmlNodeSetPtr ns) {
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL))
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlStrdup((const xmlChar *) ""));
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns->nodeNr > 1)
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetSort(ns);
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCastNodeToString(ns->nodeTab[0]));
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToString:
5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the allocated string value of the object, NULL in case of error.
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         It's up to the caller to free the string memory with xmlFree().
5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToString(xmlXPathObjectPtr val) {
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlStrdup((const xmlChar *) ""));
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_UNDEFINED:
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "String: undefined\n");
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "");
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCastNodeSetToString(val->nodesetval);
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_STRING:
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlStrdup(val->stringval));
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCastBooleanToString(val->boolval);
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NUMBER: {
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCastNumberToString(val->floatval);
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_USERS:
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrdup((const xmlChar *) "");
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertString:
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertString(xmlXPathObjectPtr val) {
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *res = NULL;
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewCString(""));
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n");
5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNodeSetToString(val->nodesetval);
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastBooleanToString(val->boolval);
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlXPathCastNumberToString(val->floatval);
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(val);
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res == NULL)
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewCString(""));
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathWrapString(res));
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToNumber:
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a boolean
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its number value
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToNumber(int val) {
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val)
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1.0);
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0.0);
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToNumber:
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a string
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its number value
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToNumber(const xmlChar * val) {
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathStringEvalNumber(val));
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToNumber:
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its number value
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToNumber (xmlNodePtr node) {
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *strval;
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    strval = xmlXPathCastNodeToString(node);
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (strval == NULL)
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCastStringToNumber(strval);
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(strval);
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToNumber:
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a node-set
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its number value
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) {
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str;
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns == NULL)
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = xmlXPathCastNodeSetToString(ns);
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathCastStringToNumber(str);
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(str);
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToNumber:
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its number value
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToNumber(xmlXPathObjectPtr val) {
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret = 0.0;
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNAN);
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEGUB_EXPR
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n");
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathNAN;
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastNodeSetToNumber(val->nodesetval);
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastStringToNumber(val->stringval);
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = val->floatval;
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastBooleanToNumber(val->boolval);
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathNAN;
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertNumber:
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertNumber(xmlXPathObjectPtr val) {
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewFloat(0.0));
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_NUMBER)
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNewFloat(xmlXPathCastToNumber(val));
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(val);
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToBoolean:
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a number
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its boolean value
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToBoolean (double val) {
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     if (xmlXPathIsNaN(val) || (val == 0.0))
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return(0);
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     return(1);
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToBoolean:
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  a string
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its boolean value
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToBoolean (const xmlChar *val) {
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val == NULL) || (xmlStrlen(val) == 0))
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToBoolean:
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  a node-set
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its boolean value
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) {
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->nodeNr == 0))
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToBoolean:
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its boolean value
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToBoolean (xmlXPathObjectPtr val) {
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_UNDEFINED:
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n");
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NODESET:
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_XSLT_TREE:
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastNodeSetToBoolean(val->nodesetval);
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_STRING:
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastStringToBoolean(val->stringval);
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_NUMBER:
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathCastNumberToBoolean(val->floatval);
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_BOOLEAN:
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = val->boolval;
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_USERS:
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_POINT:
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_RANGE:
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case XPATH_LOCATIONSET:
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO;
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertBoolean:
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  an XPath object
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         is done directly on @val)
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertBoolean(xmlXPathObjectPtr val) {
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr ret;
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathNewBoolean(0));
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val->type == XPATH_BOOLEAN)
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val));
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(val);
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Routines to handle XPath contexts			*
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewContext:
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the XML document
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathContext
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathContext just allocated. The caller will need to free it.
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextPtr
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewContext(xmlDocPtr doc) {
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextPtr ret;
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext));
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "creating context\n");
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathContext));
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = NULL;
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->varHash = NULL;
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nb_types = 0;
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->max_types = 0;
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->types = NULL;
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->funcHash = xmlHashCreate(0);
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nb_axis = 0;
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->max_axis = 0;
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->axis = NULL;
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nsHash = NULL;
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user = NULL;
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->contextSize = -1;
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->proximityPosition = -1;
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEFAULT_CACHE_ON
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) {
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeContext(ret);
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterAllFunctions(ret);
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeContext:
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context to free
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathContext
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeContext(xmlXPathContextPtr ctxt) {
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->cache != NULL)
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisteredNsCleanup(ctxt);
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisteredFuncsCleanup(ctxt);
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisteredVariablesCleanup(ctxt);
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlResetError(&ctxt->lastError);
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Routines to handle XPath parser contexts		*
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT(ctxt)						\
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) { 						\
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,				\
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, XML_FROM_XPATH,				\
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL,			\
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		__FILE__, __LINE__,					\
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL, 0, 0,					\
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"NULL context pointer\n");				\
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);							\
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }									\
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT_NEG(ctxt)						\
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) { 						\
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	__xmlRaiseError(NULL, NULL, NULL,				\
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, XML_FROM_XPATH,				\
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL,			\
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		__FILE__, __LINE__,					\
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL, 0, 0,					\
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"NULL context pointer\n");				\
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);							\
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }									\
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CONTEXT(ctxt)						\
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->doc == NULL) ||			\
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->doc->children == NULL)) { 				\
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT);	\
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);							\
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewParserContext:
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated.
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParserContextPtr
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) {
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ret;
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext));
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(ctxt, "creating parser context\n");
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext));
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->cur = ret->base = str;
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = ctxt;
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->comp = xmlXPathNewCompExpr();
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->comp == NULL) {
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret->valueTab);
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->dict != NULL)) {
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->comp->dict = ctxt->dict;
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictReference(ret->comp->dict);
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompParserContext:
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the XPath compiled expression
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext when processing a compiled expression
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated.
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathParserContextPtr
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) {
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ret;
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext));
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(ctxt, "creating evaluation context\n");
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext));
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Allocate the value stack */
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->valueTab = (xmlXPathObjectPtr *)
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlMalloc(10 * sizeof(xmlXPathObjectPtr));
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->valueTab == NULL) {
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathErrMemory(ctxt, "creating evaluation context\n");
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->valueNr = 0;
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->valueMax = 10;
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->value = NULL;
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = ctxt;
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->comp = comp;
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeParserContext:
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context to free
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathParserContext
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) {
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueTab != NULL) {
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->valueTab);
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->comp != NULL) {
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->comp->stream != NULL) {
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreePatternList(ctxt->comp->stream);
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->comp->stream = NULL;
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeCompExpr(ctxt->comp);
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		The implicit core function library			*
6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeValHash:
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node pointer
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node,
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeValHash(xmlNodePtr node) {
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 2;
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar * string = NULL;
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp = NULL;
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int ret = 0;
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL)
6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->type == XML_DOCUMENT_NODE) {
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlDocGetRootElement((xmlDocPtr) node);
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL)
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->children;
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = tmp;
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node == NULL)
6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (node->type) {
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    string = node->content;
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string == NULL)
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string[0] == 0)
6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(((unsigned int) string[0]) +
6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (((unsigned int) string[1]) << 8));
6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    string = ((xmlNsPtr)node)->href;
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string == NULL)
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string[0] == 0)
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(((unsigned int) string[0]) +
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (((unsigned int) string[1]) << 8));
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = ((xmlAttrPtr) node)->children;
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = node->children;
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (tmp != NULL) {
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (tmp->type) {
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_COMMENT_NODE:
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_PI_NODE:
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_CDATA_SECTION_NODE:
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_TEXT_NODE:
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		string = tmp->content;
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL:
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		string = ((xmlNsPtr)tmp)->href;
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((string != NULL) && (string[0] != 0)) {
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (len == 1) {
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret + (((unsigned int) string[0]) << 8));
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (string[1] == 0) {
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len = 1;
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (unsigned int) string[0];
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(((unsigned int) string[0]) +
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       (((unsigned int) string[1]) << 8));
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Skip to next node
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) {
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp->children->type != XML_ENTITY_DECL) {
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = tmp->children;
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == node)
6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp->next != NULL) {
6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = tmp->next;
6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = tmp->parent;
6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL)
6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == node) {
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = NULL;
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp->next != NULL) {
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = tmp->next;
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (tmp != NULL);
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringHash:
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string:  a string
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node,
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringHash(const xmlChar * string) {
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string == NULL)
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((unsigned int) 0);
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string[0] == 0)
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(((unsigned int) string[0]) +
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (((unsigned int) string[1]) << 8));
6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetFloat:
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the node set
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the value
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a number
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns < @val    (1, 1, ...
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns <= @val   (1, 0, ...
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns > @val    (0, 1, ...
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns >= @val   (0, 0, ...
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number,
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in the
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set such that the result of performing the comparison on the number
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be compared and on the result of converting the string-value of that
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node to a number using the number function is true.
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict,
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    xmlXPathObjectPtr arg, xmlXPathObjectPtr f) {
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, ret = 0;
6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns;
6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str2;
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((f == NULL) || (arg == NULL) ||
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) {
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg);
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, f);
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ns->nodeNr;i++) {
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     str2 = xmlXPathCastNodeToString(ns->nodeTab[i]);
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (str2 != NULL) {
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt,
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCacheNewString(ctxt->context, str2));
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlFree(str2);
6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlXPathNumberFunction(ctxt, 1);
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f));
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ret = xmlXPathCompareValues(ctxt, inf, strict);
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 if (ret)
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     break;
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     }
6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, f);
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetString:
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the node set
6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @s:  the value
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a string
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns < @val    (1, 1, ...
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns <= @val   (1, 0, ...
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns > @val    (0, 1, ...
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns >= @val   (0, 0, ...
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string,
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true.
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict,
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    xmlXPathObjectPtr arg, xmlXPathObjectPtr s) {
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, ret = 0;
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns;
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str2;
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((s == NULL) || (arg == NULL) ||
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) {
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg);
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, s);
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ns->nodeNr;i++) {
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     str2 = xmlXPathCastNodeToString(ns->nodeTab[i]);
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     if (str2 != NULL) {
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt,
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCacheNewString(ctxt->context, str2));
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlFree(str2);
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s));
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ret = xmlXPathCompareValues(ctxt, inf, strict);
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 if (ret)
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     break;
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     }
6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, s);
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSets:
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first node set object
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second node set object
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation on nodesets:
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a node in the second node-set such that the result of performing
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison on the string-values of the two nodes is true.
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ....
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is <=, <, >= or >, then the objects are compared by converting both
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * objects to numbers and comparing the numbers according to IEEE 754.
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ....
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The number function converts its argument to a number as follows:
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - a string that consists of optional whitespace followed by an
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    optional minus sign followed by a Number followed by whitespace
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    is converted to the IEEE 754 number that is nearest (according
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    to the IEEE 754 round-to-nearest rule) to the mathematical value
6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    represented by the string; any other string is converted to NaN
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Conclusion all nodes need to be converted first to their string value
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then the comparison must be done when possible
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSets(int inf, int strict,
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) {
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, init = 0;
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val1;
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double *values2;
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns1;
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns2;
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) ||
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) {
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2 == NULL) ||
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) {
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns1 = arg1->nodesetval;
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns2 = arg2->nodesetval;
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns1 == NULL) || (ns1->nodeNr <= 0)) {
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns2 == NULL) || (ns2->nodeNr <= 0)) {
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double));
6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (values2 == NULL) {
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ns1->nodeNr;i++) {
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]);
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(val1))
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0;j < ns2->nodeNr;j++) {
6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (init == 0) {
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]);
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathIsNaN(values2[j]))
6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (inf && strict)
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 < values2[j]);
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (inf && !strict)
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 <= values2[j]);
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (!inf && strict)
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 > values2[j]);
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (!inf && !strict)
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (val1 >= values2[j]);
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret)
6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret)
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	init = 1;
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(values2);
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(arg1);
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeObject(arg2);
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetValue:
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the node set
6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the value
6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a value
6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns < @val    (1, 1, ...
6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns <= @val   (1, 0, ...
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns > @val    (0, 1, ...
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @ns >= @val   (0, 0, ...
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a boolean,
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if the result of performing
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison on the boolean and on the result of converting
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set to a boolean using the boolean function is true.
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict,
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    xmlXPathObjectPtr arg, xmlXPathObjectPtr val) {
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val == NULL) || (arg == NULL) ||
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch(val->type) {
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val));
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareNodeSets(inf, strict, arg, val));
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val));
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, arg);
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathBooleanFunction(ctxt, 1);
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, val);
6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCompareValues(ctxt, inf, strict));
6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetString:
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the nodeset object argument
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the string to compare to.
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq:  flag to show whether for '=' (0) or '!=' (1)
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string,
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true.
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq)
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns;
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str2;
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int hash;
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((str == NULL) || (arg == NULL) ||
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * A NULL nodeset compared with a string is always false
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * (since there is no node equal, and no node not equal)
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns == NULL) || (ns->nodeNr <= 0) )
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hash = xmlXPathStringHash(str);
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ns->nodeNr; i++) {
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) {
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            str2 = xmlNodeGetContent(ns->nodeTab[i]);
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((str2 != NULL) && (xmlStrEqual(str, str2))) {
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(str2);
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (neq)
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) {
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (neq)
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (neq) {
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (str2 != NULL)
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(str2);
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (str2 != NULL)
6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(str2);
6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (neq)
6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetFloat:
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg:  the nodeset object argument
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the float to compare to
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq:  flag to show whether to compare '=' (0) or '!=' (1)
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number,
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number to be compared and on the result of converting the string-value
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of that node to a number using the number function is true.
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt,
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg, double f, int neq) {
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  int i, ret=0;
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlNodeSetPtr ns;
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlChar *str2;
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr val;
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  double v;
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg == NULL) ||
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = arg->nodesetval;
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i=0;i<ns->nodeNr;i++) {
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str2 = xmlXPathCastNodeToString(ns->nodeTab[i]);
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (str2 != NULL) {
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2));
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(str2);
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNumberFunction(ctxt, 1);
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val = valuePop(ctxt);
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v = val->floatval;
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, val);
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlXPathIsNaN(v)) {
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((!neq) && (v==f)) {
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((neq) && (v!=f)) {
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {	/* NaN is unequal to any value */
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (neq)
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSets:
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  first nodeset object argument
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  second nodeset object argument
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq:   flag to show whether to test '=' (0) or '!=' (1)
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal / not equal operation on XPath nodesets:
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 == @arg2  or  @arg1 != @arg2
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set and
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a node in the second node-set such that the result of performing the
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison on the string-values of the two nodes is true.
6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (needless to say, this is a costly operation)
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) {
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int *hashs1;
6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int *hashs2;
6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar **values1;
6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar **values2;
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns1;
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ns2;
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) ||
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)))
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2 == NULL) ||
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE)))
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns1 = arg1->nodesetval;
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns2 = arg2->nodesetval;
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns1 == NULL) || (ns1->nodeNr <= 0))
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ns2 == NULL) || (ns2->nodeNr <= 0))
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * for equal, check if there is a node pertaining to both sets
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (neq == 0)
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ns1->nodeNr;i++)
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0;j < ns2->nodeNr;j++)
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ns1->nodeTab[i] == ns2->nodeTab[j])
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *));
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (values1 == NULL) {
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int));
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hashs1 == NULL) {
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values1);
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *));
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *));
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (values2 == NULL) {
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(hashs1);
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values1);
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int));
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hashs2 == NULL) {
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathErrMemory(NULL, "comparing nodesets\n");
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(hashs1);
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values1);
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(values2);
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *));
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ns1->nodeNr;i++) {
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]);
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0;j < ns2->nodeNr;j++) {
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i == 0)
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]);
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (hashs1[i] != hashs2[j]) {
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (neq) {
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (values1[i] == NULL)
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    values1[i] = xmlNodeGetContent(ns1->nodeTab[i]);
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (values2[j] == NULL)
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    values2[j] = xmlNodeGetContent(ns2->nodeTab[j]);
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlStrEqual(values1[i], values2[j]) ^ neq;
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret)
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret)
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ns1->nodeNr;i++)
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (values1[i] != NULL)
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(values1[i]);
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (j = 0;j < ns2->nodeNr;j++)
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (values2[j] != NULL)
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(values2[j]);
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(values1);
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(values2);
6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(hashs1);
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(hashs2);
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt,
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) {
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *At this point we are assured neither arg1 nor arg2
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *is a nodeset, so we can just pick the appropriate routine.
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (arg1->type) {
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_UNDEFINED:
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Equal: undefined\n");
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (arg2->type) {
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        case XPATH_UNDEFINED:
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: undefined\n");
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: %d boolean %d \n",
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    arg1->boolval, arg2->boolval);
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg1->boolval == arg2->boolval);
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg1->boolval ==
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCastNumberToBoolean(arg2->floatval));
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((arg2->stringval == NULL) ||
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(arg2->stringval[0] == 0)) ret = 0;
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg1->boolval == ret);
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (arg2->type) {
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        case XPATH_UNDEFINED:
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: undefined\n");
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg2->boolval==
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlXPathCastNumberToBoolean(arg1->floatval));
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt, arg2);
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNumberFunction(ctxt, 1);
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    arg2 = valuePop(ctxt);
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* no break on purpose */
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Hand check NaN and Infinity equalities */
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlXPathIsNaN(arg1->floatval) ||
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    	    xmlXPathIsNaN(arg2->floatval)) {
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = 0;
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == 1) {
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (xmlXPathIsInf(arg2->floatval) == 1)
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == -1) {
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg2->floatval) == -1)
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == 1) {
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == 1)
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == -1) {
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == -1)
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = (arg1->floatval == arg2->floatval);
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (arg2->type) {
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        case XPATH_UNDEFINED:
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Equal: undefined\n");
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_BOOLEAN:
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((arg1->stringval == NULL) ||
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(arg1->stringval[0] == 0)) ret = 0;
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = (arg2->boolval == ret);
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_STRING:
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStrEqual(arg1->stringval, arg2->stringval);
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NUMBER:
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt, arg1);
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNumberFunction(ctxt, 1);
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    arg1 = valuePop(ctxt);
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Hand check NaN and Infinity equalities */
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlXPathIsNaN(arg1->floatval) ||
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    	    xmlXPathIsNaN(arg2->floatval)) {
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = 0;
6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == 1) {
6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg2->floatval) == 1)
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg1->floatval) == -1) {
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg2->floatval) == -1)
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == 1) {
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == 1)
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlXPathIsInf(arg2->floatval) == -1) {
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlXPathIsInf(arg1->floatval) == -1)
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = (arg1->floatval == arg2->floatval);
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_USERS:
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_POINT:
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_RANGE:
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_LOCATIONSET:
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_NODESET:
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XPATH_XSLT_TREE:
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_USERS:
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_POINT:
6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_RANGE:
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_NODESET:
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_XSLT_TREE:
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg1);
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg2);
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualValues:
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValues(xmlXPathParserContextPtr ctxt) {
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2, argtmp;
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(0);
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg2 = valuePop(ctxt);
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = valuePop(ctxt);
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) || (arg2 == NULL)) {
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (arg1 != NULL)
7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg1);
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1 == arg2) {
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Equal: by pointer\n");
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(1);
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *If either argument is a nodeset, it's a 'special case'
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) ||
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *Hack it to assure arg1 is the nodeset
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) {
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argtmp = arg2;
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg2 = arg1;
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg1 = argtmp;
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (arg2->type) {
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_UNDEFINED:
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Equal: undefined\n");
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_XSLT_TREE:
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSets(arg1, arg2, 0);
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((arg1->nodesetval == NULL) ||
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (arg1->nodesetval->nodeNr == 0)) ret = 0;
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (ret == arg2->boolval);
7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0);
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0);
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_USERS:
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_POINT:
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_RANGE:
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_LOCATIONSET:
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg2);
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2));
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotEqualValues:
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test.
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) {
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2, argtmp;
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(0);
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg2 = valuePop(ctxt);
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = valuePop(ctxt);
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) || (arg2 == NULL)) {
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (arg1 != NULL)
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg1);
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1 == arg2) {
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"NotEqual: by pointer\n");
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *If either argument is a nodeset, it's a 'special case'
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) ||
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *Hack it to assure arg1 is the nodeset
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) {
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argtmp = arg2;
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg2 = arg1;
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg1 = argtmp;
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (arg2->type) {
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_UNDEFINED:
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"NotEqual: undefined\n");
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NODESET:
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_XSLT_TREE:
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSets(arg1, arg2, 1);
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_BOOLEAN:
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((arg1->nodesetval == NULL) ||
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (arg1->nodesetval->nodeNr == 0)) ret = 0;
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (ret != arg2->boolval);
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_NUMBER:
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1);
7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_STRING:
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1);
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_USERS:
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_POINT:
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_RANGE:
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XPATH_LOCATIONSET:
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg2);
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2));
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareValues:
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf:  less than (1) or greater than (0)
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict:  is the comparison strict
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation on XPath objects:
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 < @arg2    (1, 1, ...
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 <= @arg2   (1, 0, ...
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 > @arg2    (0, 1, ...
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     @arg1 >= @arg2   (0, 0, ...
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator is
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <=, <, >=, >, then the objects are compared by converted both objects
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to numbers and comparing the numbers according to IEEE 754. The <
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison will be true if and only if the first number is less than the
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * second number. The <= comparison will be true if and only if the first
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number is less than or equal to the second number. The > comparison
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if the first number is greater than the second
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number. The >= comparison will be true if and only if the first number
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is greater than or equal to the second number.
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison succeeded, 0 if it failed
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) {
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, arg1i = 0, arg2i = 0;
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(0);
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg2 = valuePop(ctxt);
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg1 = valuePop(ctxt);
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg1 == NULL) || (arg2 == NULL)) {
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (arg1 != NULL)
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg1);
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) ||
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * are not freed from within this routine; they will be freed from the
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) &&
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2);
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) {
7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict,
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                          arg1, arg2);
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict,
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                          arg2, arg1);
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1->type != XPATH_NUMBER) {
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, arg1);
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNumberFunction(ctxt, 1);
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg1 = valuePop(ctxt);
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1->type != XPATH_NUMBER) {
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg1);
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(arg2);
7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2->type != XPATH_NUMBER) {
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, arg2);
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNumberFunction(ctxt, 1);
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg2 = valuePop(ctxt);
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2->type != XPATH_NUMBER) {
7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg1);
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, arg2);
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR0(XPATH_INVALID_OPERAND);
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Add tests for infinity and nan
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * => feedback on 3.4 for Inf and NaN
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Hand check NaN and Infinity comparisons */
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) {
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret=0;
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg1i=xmlXPathIsInf(arg1->floatval);
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg2i=xmlXPathIsInf(arg2->floatval);
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (inf && strict) {
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1i == -1 && arg2i != -1) ||
7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(arg2i == 1 && arg1i != 1)) {
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval < arg2->floatval);
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (inf && !strict) {
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (arg1i == -1 || arg2i == 1) {
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval <= arg2->floatval);
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (!inf && strict) {
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1i == 1 && arg2i != 1) ||
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(arg2i == -1 && arg1i != -1)) {
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval > arg2->floatval);
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (!inf && !strict) {
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (arg1i == 1 || arg2i == -1) {
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (arg1i == 0 && arg2i == 0) {
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (arg1->floatval >= arg2->floatval);
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg1);
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg2);
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathValueFlipSign:
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the unary - operation on an XPath object
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) {
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return;
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(ctxt->value->floatval))
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval=xmlXPathNAN;
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlXPathIsInf(ctxt->value->floatval) == 1)
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval=xmlXPathNINF;
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlXPathIsInf(ctxt->value->floatval) == -1)
7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval=xmlXPathPINF;
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (ctxt->value->floatval == 0) {
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlXPathGetSign(ctxt->value->floatval) == 0)
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNZERO;
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = 0;
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->value->floatval = - ctxt->value->floatval;
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathAddValues:
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the add operation on XPath objects:
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathAddValues(xmlXPathParserContextPtr ctxt) {
7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval += val;
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubValues:
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the subtraction operation on XPath objects:
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubValues(xmlXPathParserContextPtr ctxt) {
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval -= val;
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathMultValues:
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the multiply operation on XPath objects:
7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathMultValues(xmlXPathParserContextPtr ctxt) {
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval *= val;
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDivValues:
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the div operation on XPath objects @arg1 / @arg2:
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if
7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function.
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDivValues(xmlXPathParserContextPtr ctxt) {
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double val;
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    arg = valuePop(ctxt);
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg == NULL)
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_OPERAND);
7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlXPathCastToNumber(arg);
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, arg);
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval))
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval = xmlXPathNAN;
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (val == 0 && xmlXPathGetSign(val) != 0) {
7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval == 0)
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNAN;
7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval > 0)
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNINF;
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval < 0)
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathPINF;
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (val == 0) {
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval == 0)
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNAN;
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval > 0)
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathPINF;
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->floatval < 0)
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNINF;
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
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 * xmlXPathModValues:
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the mod operation on XPath objects: @arg1 / @arg2
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 ProjectxmlXPathModValues(xmlXPathParserContextPtr ctxt) {
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg;
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double arg1, arg2;
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    arg2 = 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    arg1 = ctxt->value->floatval;
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2 == 0)
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval = xmlXPathNAN;
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->floatval = fmod(arg1, arg2);
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		The traversal functions					*
7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis.
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL.
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunction)
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlXPathParserContextPtr ctxt, xmlNodePtr cur);
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTraversalFunctionExt:
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis.
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL.
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The context node of the traversal is specified via @contextNode.
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunctionExt)
7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlNodePtr cur, xmlNodePtr contextNode);
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeFunction:
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used for merging node sets in xmlXPathCollectAndTest().
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction)
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlNodeSetPtr, xmlNodeSetPtr, int);
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextSelf:
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "self" direction
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The self axis contains just the context node itself
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node);
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChild:
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order.
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) return(NULL);
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (ctxt->context->node->type) {
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DTD_NODE:
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->context->node->children);
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(((xmlDocPtr) ctxt->context->node)->children);
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_DECL:
7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ATTRIBUTE_DECL:
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_DECL:
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE:
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL:
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_END:
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type == XML_DOCUMENT_NODE) ||
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (cur->type == XML_HTML_DOCUMENT_NODE))
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur->next);
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChildElement:
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction and nodes of type element.
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order.
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = ctxt->context->node;
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL) return(NULL);
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the first element child.
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->type) {
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCUMENT_FRAG_NODE:
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->children;
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur != NULL) {
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->type == XML_ELEMENT_NODE)
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(cur);
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->next;
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while ((cur != NULL) &&
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(cur->type != XML_ELEMENT_NODE));
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(cur);
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlDocGetRootElement((xmlDocPtr) cur));
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Get the next sibling element node.
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (cur->type) {
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_REF_NODE:
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_NODE:
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_XINCLUDE_END:
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) {
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->next->type == XML_ELEMENT_NODE)
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur->next);
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE));
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(cur);
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelfElemParent:
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" axis.
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Additionally it returns only nodes which can be parents of
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element nodes.
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur,
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlNodePtr contextNode)
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextNode == NULL)
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (contextNode->type) {
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_NODE:
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCUMENT_FRAG_NODE:
7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCUMENT_NODE:
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_HTML_DOCUMENT_NODE:
7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(contextNode);
7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr start = cur;
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (cur->type) {
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_ELEMENT_NODE:
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: OK to have XInclude here? */
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_XINCLUDE_START:
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DOCUMENT_FRAG_NODE:
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur != start)
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(cur);
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->children != NULL) {
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->children;
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue;
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Not sure if we need those here. */
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DOCUMENT_NODE:
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_DOCB_DOCUMENT_NODE:
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_HTML_DOCUMENT_NODE:
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur != start)
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(cur);
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(xmlDocGetRootElement((xmlDocPtr) cur));
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sibling:
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur == NULL) || (cur == contextNode))
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->next != NULL) {
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->parent;
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_sibling;
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendant:
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant" direction
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant axis contains the descendants of the context node in document
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order; a descendant is a child or a child of a child and so on.
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL)
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->context->node->type == XML_NAMESPACE_DECL))
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->context->doc->children);
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node->children);
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->children != NULL) {
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Do not descend on entities declarations
7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	if (cur->children->type != XML_ENTITY_DECL) {
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->children;
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Skip DTDs
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->type != XML_DTD_NODE)
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == ctxt->context->node) return(NULL);
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->next != NULL) {
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type != XML_ENTITY_DECL) &&
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->type != XML_DTD_NODE))
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur);
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL) break;
7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == ctxt->context->node) return(NULL);
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->next != NULL) {
7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur);
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (cur != NULL);
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelf:
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" direction
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant-or-self axis contains the context node and the descendants
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node in document order; thus the context node is the first
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis, and the first child of the context node is the second node
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the axis
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL)
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->context->node->type == XML_NAMESPACE_DECL))
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node);
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNextDescendant(ctxt, cur));
7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextParent:
7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "parent" direction
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parent axis contains the parent of the context node, if there is one.
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the parent of an attribute or namespace node is the element
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * to which the attribute or namespace node is attached
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Namespace handling !!!
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) return(NULL);
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (ctxt->context->node->type) {
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DTD_NODE:
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_DECL:
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ATTRIBUTE_DECL:
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_END:
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_DECL:
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->context->node->parent == NULL)
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ctxt->context->doc);
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((ctxt->context->node->parent->name[0] == ' ') ||
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (xmlStrEqual(ctxt->context->node->parent->name,
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 BAD_CAST "fake node libxslt"))))
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->context->node->parent);
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE: {
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(att->parent);
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL: {
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ns->next != NULL) &&
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (ns->next->type != XML_NAMESPACE_DECL))
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ns->next);
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestor:
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor" direction
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the ancestor axis contains the ancestors of the context node; the ancestors
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node consist of the parent of context node and the parent's
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent and so on; the nodes are ordered in reverse document order; thus the
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent is the first node on the axis, and the parent's parent is the second
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the parent of an attribute or namespace node is the element
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * to which the attribute or namespace node is attached
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * !!!!!!!!!!!!!
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) return(NULL);
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (ctxt->context->node->type) {
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DTD_NODE:
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_DECL:
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ATTRIBUTE_DECL:
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ENTITY_DECL:
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_START:
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_XINCLUDE_END:
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->context->node->parent == NULL)
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ctxt->context->doc);
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((ctxt->context->node->parent->name[0] == ' ') ||
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (xmlStrEqual(ctxt->context->node->parent->name,
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 BAD_CAST "fake node libxslt"))))
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->context->node->parent);
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE: {
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node;
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(tmp->parent);
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_DOCB_DOCUMENT_NODE:
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_NAMESPACE_DECL: {
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ns->next != NULL) &&
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (ns->next->type != XML_NAMESPACE_DECL))
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return((xmlNodePtr) ns->next);
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Bad, how did that namespace end up here ? */
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == ctxt->context->doc->children)
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((xmlNodePtr) ctxt->context->doc);
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == (xmlNodePtr) ctxt->context->doc)
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (cur->type) {
7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_TEXT_NODE:
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_CDATA_SECTION_NODE:
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_REF_NODE:
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ENTITY_NODE:
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_COMMENT_NODE:
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NOTATION_NODE:
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DTD_NODE:
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ELEMENT_DECL:
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ATTRIBUTE_DECL:
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_ENTITY_DECL:
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_XINCLUDE_START:
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_XINCLUDE_END:
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->parent == NULL)
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->parent->type == XML_ELEMENT_NODE) &&
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->parent->name[0] == ' ') ||
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (xmlStrEqual(cur->parent->name,
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      BAD_CAST "fake node libxslt"))))
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(cur->parent);
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE: {
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(att->parent);
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL: {
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ns->next != NULL) &&
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (ns->next->type != XML_NAMESPACE_DECL))
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return((xmlNodePtr) ns->next);
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Bad, how did that namespace end up here ? */
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(NULL);
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCUMENT_NODE:
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCUMENT_TYPE_NODE:
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCUMENT_FRAG_NODE:
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_HTML_DOCUMENT_NODE:
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_DOCB_DOCUMENT_NODE:
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestorOrSelf:
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor-or-self" direction
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * he ancestor-or-self axis contains the context node and ancestors of
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node in reverse document order; thus the context node is
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node on the axis, and the context node's parent the second;
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent here is defined the same as with the parent axis.
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node);
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathNextAncestor(ctxt, cur));
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowingSibling:
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following-sibling" direction
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following-sibling axis contains the following siblings of the context
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in document order.
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->context->node->type == XML_NAMESPACE_DECL))
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == (xmlNodePtr) ctxt->context->doc)
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node->next);
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur->next);
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingSibling:
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding-sibling" direction
8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The preceding-sibling axis contains the preceding siblings of the context
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in reverse document order; the first preceding sibling is first on the
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * axis; the sibling preceding that node is the second on the axis and so on.
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->context->node->type == XML_NAMESPACE_DECL))
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == (xmlNodePtr) ctxt->context->doc)
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ctxt->context->node->prev);
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) {
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->prev;
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == NULL)
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->context->node->prev);
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur->prev);
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowing:
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following" direction
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following axis contains all nodes in the same document as the context
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are after the context node in document order, excluding any
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * descendants and excluding attribute nodes and namespace nodes; the nodes
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are ordered in document order
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL && cur->children != NULL)
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return cur->children ;
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) cur = ctxt->context->node;
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return(NULL) ; /* ERROR */
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) return(cur->next) ;
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL) break;
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL);
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) return(cur->next);
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (cur != NULL);
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAncestor:
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ancestor:  the ancestor node
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the current node
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that @ancestor is a @node's ancestor
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if @ancestor is a @node's ancestor, 0 otherwise.
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) {
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ancestor == NULL) || (node == NULL)) return(0);
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* nodes need to be in the same document */
8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ancestor->doc != node->doc) return(0);
8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* avoid searching if ancestor or node is the root node */
8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ancestor == (xmlNodePtr) node->doc) return(1);
8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == (xmlNodePtr) ancestor->doc) return(0);
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node->parent != NULL) {
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->parent == ancestor)
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(1);
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = node->parent;
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPreceding:
8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur)
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = ctxt->context->node;
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE))
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->prev;
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->prev != NULL) {
8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (cur = cur->prev; cur->last != NULL; cur = cur->last) ;
8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (cur);
8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == ctxt->context->doc->children)
8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (xmlXPathIsAncestor(cur, ctxt->context->node));
8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (cur);
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingInternal:
8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node in the traversal
8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction
8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context
8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any
8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are
8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order
8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a faster implementation but internal only since it requires a
8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state kept in the parser context: ctxt->ancestor.
8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt,
8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr cur)
8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = ctxt->context->node;
8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->type == XML_NAMESPACE_DECL)
8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlNodePtr)((xmlNsPtr)cur)->next;
8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->ancestor = cur->parent;
8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE))
8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->prev;
8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->prev == NULL) {
8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->parent;
8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == ctxt->context->doc->children)
8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != ctxt->ancestor)
8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (cur);
8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->ancestor = cur->parent;
8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->prev;
8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->last != NULL)
8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->last;
8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (cur);
8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextNamespace:
8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current attribute in the traversal
8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "namespace" direction
8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace axis contains the namespace nodes of the context node;
8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the order of nodes on this axis is implementation-defined; the axis will
8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be empty unless the context node is an element
8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We keep the XML namespace node at the end of the list.
8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL);
8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) {
8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->context->tmpNsList != NULL)
8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ctxt->context->tmpNsList);
8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->tmpNsList =
8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGetNsList(ctxt->context->doc, ctxt->context->node);
8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->tmpNsNr = 0;
8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->tmpNsList != NULL) {
8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) {
8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->tmpNsNr++;
8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((xmlNodePtr) xmlXPathXMLNamespace);
8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->tmpNsNr > 0) {
8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr];
8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->tmpNsList != NULL)
8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ctxt->context->tmpNsList);
8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->tmpNsList = NULL;
8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAttribute:
8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current attribute in the traversal
8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "attribute" direction
8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: support DTD inherited default attributes
8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis
8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr
8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->node == NULL)
8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->node->type != XML_ELEMENT_NODE)
8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return((xmlNodePtr)ctxt->context->node->properties);
8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlNodePtr)cur->next);
8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		NodeTest Functions					*
8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_FUNCTION			200
8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Implicit tree core function library			*
8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoot:
8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the context to the root of the document
8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoot(xmlXPathParserContextPtr ctxt) {
8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->context == NULL))
8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = (xmlNodePtr) ctxt->context->doc;
8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node));
8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		The explicit core function library			*
8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib	*
8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLastFunction:
8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the last() XPath function
8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number last()
8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The last function returns the number of nodes in the context node list.
8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->contextSize >= 0) {
8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt,
8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCacheNewFloat(ctxt->context,
8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(double) ctxt->context->contextSize));
8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"last() : %d\n", ctxt->context->contextSize);
8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_CTXT_SIZE);
8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPositionFunction:
8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the position() XPath function
8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number position()
8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The position function returns the position of the context node in the
8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node list. The first position is 1, and so the last position
8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be equal to last().
8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->context->proximityPosition >= 0) {
8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt,
8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      xmlXPathCacheNewFloat(ctxt->context,
8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(double) ctxt->context->proximityPosition));
8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "position() : %d\n",
8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->proximityPosition);
8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_CTXT_POSITION);
8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCountFunction:
8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the count() XPath function
8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number count(node-set)
8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (cur->nodesetval == NULL))
8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0));
8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) {
8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (double) cur->nodesetval->nodeNr));
8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->nodesetval->nodeNr != 1) ||
8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->nodesetval->nodeTab == NULL)) {
8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0));
8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr tmp;
8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i = 0;
8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = cur->nodesetval->nodeTab[0];
8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != NULL) {
8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = tmp->children;
8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (tmp != NULL) {
8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = tmp->next;
8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i));
8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetElementsByIds:
8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ids:  a whitespace separated list of IDs
8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Selects elements by their unique ID.
8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node-set of selected elements.
8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr
8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) {
8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = ids;
8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ID;
8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr elem = NULL;
8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ids == NULL) return(NULL);
8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathNodeSetCreate(NULL);
8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) cur++;
8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur != 0) {
8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((!IS_BLANK_CH(*cur)) && (*cur != 0))
8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ID = xmlStrndup(ids, cur - ids);
8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ID != NULL) {
8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * We used to check the fact that the value passed
8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * was an NCName, but this generated much troubles for
8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * me and Aleksey Sanin, people blatantly violated that
8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * constaint, like Visa3D spec.
8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * if (xmlValidateNCName(ID, 1) == 0)
8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlGetID(doc, ID);
8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr != NULL) {
8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (attr->type == XML_ATTRIBUTE_NODE)
8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem = attr->parent;
8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (attr->type == XML_ELEMENT_NODE)
8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem = (xmlNodePtr) attr;
8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem = NULL;
8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (elem != NULL)
8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetAdd(ret, elem);
8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ID);
8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_BLANK_CH(*cur)) cur++;
8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ids = cur;
8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIdFunction:
8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the id() XPath function
8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    node-set id(object)
8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The id function selects elements by their unique ID
8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set,
8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the result is the union of the result of applying id to the
8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string value of each of the nodes in the argument node-set. When the
8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument to id is of any other type, the argument is converted to a
8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string as if by a call to the string function; the string is split
8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into a whitespace-separated list of tokens (whitespace is any sequence
8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of characters matching the production S); the result is a node-set
8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * containing the elements in the same document as the context node that
8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have a unique ID equal to any of the tokens in the list.
8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *tokens;
8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr ret;
8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) {
8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodeSetPtr ns;
8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathNodeSetCreate(NULL);
8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (obj->nodesetval != NULL) {
8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < obj->nodesetval->nodeNr; i++) {
8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tokens =
8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]);
8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens);
8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlXPathNodeSetMerge(ret, ns);
8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeNodeSet(ns);
8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tokens != NULL)
8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(tokens);
8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, obj);
8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret));
8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = xmlXPathCacheConvertString(ctxt->context, obj);
8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval);
8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret));
8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, obj);
8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLocalNameFunction:
8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the local-name() XPath function
8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string local-name(node-set?)
8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The local-name function returns a string containing the local part
8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the name of the node in the argument node-set that is first in
8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document order. If the node-set is empty or the first node has no
8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * name, an empty string is returned. If the argument is omitted it
8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node.
8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node));
8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nargs = 1;
8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) {
8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i = 0; /* Should be first in document order !!!!! */
8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->nodesetval->nodeTab[i]->type) {
8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_PI_NODE:
8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodesetval->nodeTab[i]->name[0] == ' ')
8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt,
8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlXPathCacheNewString(ctxt->context,
8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur->nodesetval->nodeTab[i]->name));
8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_NAMESPACE_DECL:
8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix));
8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNamespaceURIFunction:
8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the namespace-uri() XPath function
8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string namespace-uri(node-set?)
8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The namespace-uri function returns a string containing the
8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace URI of the expanded name of the node in the argument
8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set that is first in document order. If the node-set is empty,
8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node has no name, or the expanded name has no namespace
8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URI, an empty string is returned. If the argument is omitted it
8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node.
8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node));
8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nargs = 1;
8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) {
8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i = 0; /* Should be first in document order !!!!! */
8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->nodesetval->nodeTab[i]->type) {
8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ELEMENT_NODE:
8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_ATTRIBUTE_NODE:
8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->nodesetval->nodeTab[i]->ns == NULL)
8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  cur->nodesetval->nodeTab[i]->ns->href));
8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNameFunction:
8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the name() XPath function
8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string name(node-set?)
8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The name function returns a string containing a QName representing
8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the name of the node in the argument node-set that is first in document
8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order. The QName must represent the name with respect to the namespace
8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declarations in effect on the node whose name is being represented.
8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Typically, this will be the form in which the name occurred in the XML
8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * source. This need not be the case if there are namespace declarations
8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in effect on the node that associate multiple prefixes with the same
8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace. However, an implementation may include information about
8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the original prefix in its representation of nodes; in this case, an
8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation can ensure that the returned string is always the same
8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as the QName used in the XML source. If the argument it omitted it
8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node.
8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Libxml keep the original prefix so the "real qualified name" used is
8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned.
8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs)
8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node));
8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nargs = 1;
8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((ctxt->value->type != XPATH_NODESET) &&
8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (ctxt->value->type != XPATH_XSLT_TREE)))
8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_INVALID_TYPE);
8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) {
8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i = 0;              /* Should be first in document order !!!!! */
8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (cur->nodesetval->nodeTab[i]->type) {
8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE:
8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->nodesetval->nodeTab[i]->name[0] == ' ')
8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt,
8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathCacheNewCString(ctxt->context, ""));
8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if ((cur->nodesetval->nodeTab[i]->ns == NULL) ||
8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) {
8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt,
8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlXPathCacheNewString(ctxt->context,
8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur->nodesetval->nodeTab[i]->name));
8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *fullname;
8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name,
8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     cur->nodesetval->nodeTab[i]->ns->prefix,
8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     NULL, 0);
8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (fullname == cur->nodesetval->nodeTab[i]->name)
8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name);
8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (fullname == NULL) {
8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_ERROR(XPATH_MEMORY_ERROR);
8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt, xmlXPathCacheWrapString(
8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->context, fullname));
8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            default:
8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->nodesetval->nodeTab[i]));
8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathLocalNameFunction(ctxt, 1);
8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringFunction:
8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string() XPath function
8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string string(object?)
8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string function converts an object to a string as follows:
8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - A node-set is converted to a string by returning the value of
8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      the node in the node-set that is first in document order.
8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      If the node-set is empty, an empty string is returned.
8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - A number is converted to a string as follows
8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + NaN is converted to the string NaN
8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + positive zero is converted to the string 0
8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + negative zero is converted to the string 0
8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + positive infinity is converted to the string Infinity
8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + negative infinity is converted to the string -Infinity
8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + if the number is an integer, the number is represented in
8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        decimal form as a Number with no decimal point and no leading
8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        zeros, preceded by a minus sign (-) if the number is negative
8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      + otherwise, the number is represented in decimal form as a
8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        Number including a decimal point with at least one digit
8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        before the decimal point and at least one digit after the
8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        decimal point, preceded by a minus sign (-) if the number
8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        is negative; there must be no leading zeros before the decimal
8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        point apart possibly from the one required digit immediately
8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        before the decimal point; beyond the one required digit
8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        after the decimal point there must be as many, but only as
8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        many, more digits as are needed to uniquely distinguish the
8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        number from all other IEEE 754 numeric values.
8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - The boolean false value is converted to the string false.
8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      The boolean true value is converted to the string true.
8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the argument is omitted, it defaults to a node-set with the
8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node as its only member.
8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt,
8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCacheWrapString(ctxt->context,
8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCastNodeToString(ctxt->context->node)));
8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur));
8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringLengthFunction:
8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string-length() XPath function
8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number string-length(string?)
8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string-length returns the number of characters in the string
8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [3.6 Strings]). If the argument is omitted, it defaults to
8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node converted to a string, in other words the value
8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node.
8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt == NULL) || (ctxt->context == NULL))
8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) {
8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0));
8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *content;
8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content = xmlXPathCastNodeToString(ctxt->context->node);
8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlUTF8Strlen(content)));
8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(content);
8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlUTF8Strlen(cur->stringval)));
8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConcatFunction:
8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the concat() XPath function
8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string concat(string, string, string*)
8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The concat function returns the concatenation of its arguments.
8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur, newobj;
8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *tmp;
8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs < 2) {
8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ARITY(2);
8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (cur->type != XPATH_STRING)) {
8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, cur);
8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nargs--;
8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (nargs > 0) {
8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CAST_TO_STRING;
8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newobj = valuePop(ctxt);
8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((newobj == NULL) || (newobj->type != XPATH_STRING)) {
8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, newobj);
8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, cur);
8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_INVALID_TYPE);
8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlStrcat(newobj->stringval, cur->stringval);
8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newobj->stringval = cur->stringval;
8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur->stringval = tmp;
8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, newobj);
8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nargs--;
8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, cur);
8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContainsFunction:
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 contains() XPath function
8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean contains(string, string)
8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contains function returns true if the first argument string
8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * contains the second argument string, and otherwise returns false.
8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr hay, needle;
8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(2);
8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    needle = valuePop(ctxt);
8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hay = valuePop(ctxt);
8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((hay == NULL) || (hay->type != XPATH_STRING)) {
8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, hay);
8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, needle);
8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrstr(hay->stringval, needle->stringval))
8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, hay);
8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, needle);
8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStartsWithFunction:
8890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the starts-with() XPath function
8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean starts-with(string, string)
8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The starts-with function returns true if the first argument string
8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starts with the second argument string, and otherwise returns false.
8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr hay, needle;
8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int n;
8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(2);
8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    needle = valuePop(ctxt);
8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hay = valuePop(ctxt);
8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((hay == NULL) || (hay->type != XPATH_STRING)) {
8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, hay);
8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, needle);
8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
8914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    n = xmlStrlen(needle->stringval);
8916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrncmp(hay->stringval, needle->stringval, n))
8917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
8918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
8920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, hay);
8921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, needle);
8922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringFunction:
8926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
8927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
8928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring() XPath function
8930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string substring(string, number, number?)
8931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring function returns the substring of the first argument
8932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starting at the position specified in the second argument with
8933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * length specified in the third argument. For example,
8934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substring("12345",2,3) returns "234". If the third argument is not
8935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specified, it returns the substring starting at the position specified
8936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the second argument and continuing to the end of the string. For
8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * example, substring("12345",2) returns "2345".  More precisely, each
8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string (see [3.6 Strings]) is considered to have a
8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * numeric position: the position of the first character is 1, the position
8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the second character is 2 and so on. The returned substring contains
8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * those characters for which the position of the character is greater than
8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or equal to the second argument and, if the third argument is specified,
8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * less than the sum of the second and third arguments; the comparisons
8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and addition used for the above follow the standard IEEE 754 rules. Thus:
8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - substring("12345", 1.5, 2.6) returns "234"
8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - substring("12345", 0, 3) returns "12"
8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - substring("12345", 0 div 0, 3) returns ""
8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - substring("12345", 1, 0 div 0) returns ""
8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - substring("12345", -42, 1 div 0) returns "12345"
8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - substring("12345", -1 div 0, 1 div 0) returns ""
8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) {
8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr str, start, len;
8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double le=0, in;
8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, l, m;
8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs < 2) {
8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ARITY(2);
8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs > 3) {
8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ARITY(3);
8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * take care of possible last (position) argument
8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 3) {
8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CAST_TO_NUMBER;
8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_TYPE(XPATH_NUMBER);
8971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = valuePop(ctxt);
8972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	le = len->floatval;
8973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, len);
8974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = valuePop(ctxt);
8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    in = start->floatval;
8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, start);
8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = valuePop(ctxt);
8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    m = xmlUTF8Strlen((const unsigned char *)str->stringval);
8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If last pos not present, calculate last position
8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs != 3) {
8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	le = (double)m;
8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (in < 1.0)
8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in = 1.0;
8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Need to check for the special cases where either
8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the index is NaN, the length is NaN, or both
8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * arguments are infinity (relying on Inf + -Inf = NaN)
8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlXPathIsNaN(in + le) && !xmlXPathIsInf(in)) {
9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * To meet the requirements of the spec, the arguments
9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * must be converted to integer format before
9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * initial index calculations are done
9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         *
9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * First we go to integer form, rounding up
9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * and checking for special cases
9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i = (int) in;
9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (((double)i)+0.5 <= in) i++;
9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsInf(le) == 1) {
9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    l = m;
9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i < 1)
9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i = 1;
9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlXPathIsInf(le) == -1 || le < 0.0)
9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    l = 0;
9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    l = (int) le;
9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((double)l)+0.5 <= le) l++;
9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Now we normalize inidices */
9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i -= 1;
9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        l += i;
9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (i < 0)
9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            i = 0;
9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (l > m)
9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            l = m;
9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* number of chars to copy */
9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        l -= i;
9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlUTF8Strsub(str->stringval, i, l);
9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = NULL;
9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, ""));
9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret));
9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, str);
9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringBeforeFunction:
9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-before() XPath function
9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string substring-before(string, string)
9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-before function returns the substring of the first
9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that precedes the first occurrence of the second
9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty string
9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument
9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-before("1999/04/01","/") returns 1999.
9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr str;
9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr find;
9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlBufferPtr target;
9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  const xmlChar *point;
9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  int offset;
9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_ARITY(2);
9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  find = valuePop(ctxt);
9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  str = valuePop(ctxt);
9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  target = xmlBufferCreate();
9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (target) {
9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    point = xmlStrstr(str->stringval, find->stringval);
9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (point) {
9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      offset = (int)(point - str->stringval);
9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlBufferAdd(target, str->stringval, offset);
9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, str);
9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, find);
9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringAfterFunction:
9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-after() XPath function
9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string substring-after(string, string)
9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-after function returns the substring of the first
9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that follows the first occurrence of the second
9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty stringi
9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument
9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-after("1999/04/01","/") returns 04/01,
9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and substring-after("1999/04/01","19") returns 99/04/01.
9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr str;
9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr find;
9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlBufferPtr target;
9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  const xmlChar *point;
9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  int offset;
9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_ARITY(2);
9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  find = valuePop(ctxt);
9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  str = valuePop(ctxt);
9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  target = xmlBufferCreate();
9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (target) {
9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    point = xmlStrstr(str->stringval, find->stringval);
9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (point) {
9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      offset = (int)(point - str->stringval) + xmlStrlen(find->stringval);
9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlBufferAdd(target, &str->stringval[offset],
9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlStrlen(str->stringval) - offset);
9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, str);
9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, find);
9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNormalizeFunction:
9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the normalize-space() XPath function
9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string normalize-space(string?)
9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The normalize-space function returns the argument string with white
9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space normalized by stripping leading and trailing whitespace
9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and replacing sequences of whitespace characters by a single
9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space. Whitespace characters are the same allowed by the S production
9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in XML. If the argument is omitted, it defaults to the context
9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node converted to a string, in other words the value of the context node.
9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathObjectPtr obj = NULL;
9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlChar *source = NULL;
9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlBufferPtr target;
9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlChar blank;
9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (ctxt == NULL) return;
9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (nargs == 0) {
9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Use current context node */
9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      valuePush(ctxt,
9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlXPathCacheWrapString(ctxt->context,
9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCastNodeToString(ctxt->context->node)));
9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nargs = 1;
9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_ARITY(1);
9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CAST_TO_STRING;
9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  CHECK_TYPE(XPATH_STRING);
9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  obj = valuePop(ctxt);
9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  source = obj->stringval;
9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  target = xmlBufferCreate();
9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  if (target && source) {
9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Skip leading whitespaces */
9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*source))
9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      source++;
9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Collapse intermediate whitespaces, and skip trailing whitespaces */
9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    blank = 0;
9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*source) {
9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      if (IS_BLANK_CH(*source)) {
9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	blank = 0x20;
9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      } else {
9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (blank) {
9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlBufferAdd(target, &blank, 1);
9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  blank = 0;
9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferAdd(target, source, 1);
9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      source++;
9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  }
9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  xmlXPathReleaseObject(ctxt->context, obj);
9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTranslateFunction:
9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the translate() XPath function
9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string translate(string, string, string)
9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The translate function returns the first argument string with
9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurrences of characters in the second argument string replaced
9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the character at the corresponding position in the third argument
9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, translate("bar","abc","ABC") returns the string
9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BAr. If there is a character in the second argument string with no
9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character at a corresponding position in the third argument string
9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (because the second argument string is longer than the third argument
9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string), then occurrences of that character in the first argument
9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string are removed. For example, translate("--aaa--","abc-","ABC")
9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "AAA". If a character occurs more than once in second
9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then the first occurrence determines the replacement
9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character. If the third argument string is longer than the second
9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then excess characters are ignored.
9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr str;
9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr from;
9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr to;
9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferPtr target;
9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int offset, max;
9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar ch;
9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *point;
9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cptr;
9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(3);
9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    to = valuePop(ctxt);
9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    from = valuePop(ctxt);
9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = valuePop(ctxt);
9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    target = xmlBufferCreate();
9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (target) {
9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	max = xmlUTF8Strlen(to->stringval);
9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (cptr = str->stringval; (ch=*cptr); ) {
9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    offset = xmlUTF8Strloc(from->stringval, cptr);
9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (offset >= 0) {
9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (offset < max) {
9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    point = xmlUTF8Strpos(to->stringval, offset);
9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (point)
9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlBufferAdd(target, point, xmlUTF8Strsize(point, 1));
9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlBufferAdd(target, cptr, xmlUTF8Strsize(cptr, 1));
9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Step to next character in input */
9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cptr++;
9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ch & 0x80 ) {
9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* if not simple ascii, verify proper format */
9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ( (ch & 0xc0) != 0xc0 ) {
9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"xmlXPathTranslateFunction: Invalid UTF8 string\n");
9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* then skip over remaining bytes for this char */
9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ( (ch <<= 1) & 0x80 )
9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ( (*cptr++ & 0xc0) != 0x80 ) {
9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlGenericError(xmlGenericErrorContext,
9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "xmlXPathTranslateFunction: Invalid UTF8 string\n");
9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ch & 0x80) /* must have had error encountered */
9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, str);
9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, from);
9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, to);
9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathBooleanFunction:
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 boolean() XPath function
9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean boolean(object)
9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The boolean function converts its argument to a boolean as follows:
9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - a number is true if and only if it is neither positive or
9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      negative zero nor NaN
9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - a node-set is true if and only if it is non-empty
9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - a string is true if and only if its length is non-zero
9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND);
9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlXPathCacheConvertBoolean(ctxt->context, cur);
9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, cur);
9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotFunction:
9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the not() XPath function
9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean not(boolean)
9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The not function returns true if its argument is false,
9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and false otherwise.
9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_BOOLEAN;
9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_BOOLEAN);
9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->boolval = ! ctxt->value->boolval;
9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrueFunction:
9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the true() XPath function
9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean true()
9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFalseFunction:
9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the false() XPath function
9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean false()
9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(0);
9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLangFunction:
9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the lang() XPath function
9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    boolean lang(string)
9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lang function returns true or false depending on whether the
9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * language of the context node as specified by xml:lang attributes
9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is the same as or is a sublanguage of the language specified by
9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument string. The language of the context node is determined
9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the value of the xml:lang attribute on the context node, or, if
9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node has no xml:lang attribute, by the value of the
9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xml:lang attribute on the nearest ancestor of the context node that
9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * has an xml:lang attribute. If there is no such attribute, then lang
9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns false. If there is such an attribute, then lang returns
9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * true if the attribute value is equal to the argument ignoring case,
9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or if there is some suffix starting with - such that the attribute
9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value is equal to the argument ignoring that suffix of the attribute
9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value and ignoring case.
9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr val = NULL;
9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *theLang = NULL;
9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *lang;
9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_STRING);
9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = valuePop(ctxt);
9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lang = val->stringval;
9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    theLang = xmlNodeGetLang(ctxt->context->node);
9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((theLang != NULL) && (lang != NULL)) {
9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0;lang[i] != 0;i++)
9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toupper(lang[i]) != toupper(theLang[i]))
9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        goto not_equal;
9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((theLang[i] == 0) || (theLang[i] == '-'))
9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 1;
9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_equal:
9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (theLang != NULL)
9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((void *)theLang);
9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, val);
9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret));
9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNumberFunction:
9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the number() XPath function
9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number number(object?)
9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double res;
9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nargs == 0) {
9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->context->node == NULL) {
9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0));
9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar* content = xmlNodeGetContent(ctxt->context->node);
9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathStringEvalNumber(content);
9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res));
9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(content);
9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur));
9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSumFunction:
9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the sum() XPath function
9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number sum(node-set)
9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The sum function returns the sum of the values of the nodes in
9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument node-set.
9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr cur;
9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double res = 0.0;
9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->value == NULL) ||
9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((ctxt->value->type != XPATH_NODESET) &&
9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (ctxt->value->type != XPATH_XSLT_TREE)))
9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_TYPE);
9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = valuePop(ctxt);
9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) {
9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < cur->nodesetval->nodeNr; i++) {
9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]);
9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res));
9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, cur);
9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * To assure working code on multiple platforms, we want to only depend
9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upon the characteristic truncation of converting a floating point value
9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to an integer.  Unfortunately, because of the different storage sizes
9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of our internal floating point value (double) and integer (int), we
9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * can't directly convert (see bug 301162).  This macro is a messy
9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 'workaround'
9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XTRUNC(f, v)            \
9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    f = fmod((v), INT_MAX);     \
9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    f = (v) - (f) + (double)((int)(f));
9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFloorFunction:
9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the floor() XPath function
9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number floor(number)
9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The floor function returns the largest (closest to positive infinity)
9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not greater than the argument and that is an integer.
9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double f;
9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XTRUNC(f, ctxt->value->floatval);
9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (f != ctxt->value->floatval) {
9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval > 0)
9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f;
9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f - 1;
9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCeilingFunction:
9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the ceiling() XPath function
9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number ceiling(number)
9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ceiling function returns the smallest (closest to negative infinity)
9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not less than the argument and that is an integer.
9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double f;
9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->value->floatval = ceil(ctxt->value->floatval);
9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XTRUNC(f, ctxt->value->floatval);
9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (f != ctxt->value->floatval) {
9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval > 0)
9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f + 1;
9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value->floatval < 0 && f == 0)
9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->value->floatval = xmlXPathNZERO;
9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->value->floatval = f;
9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoundFunction:
9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the round() XPath function
9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    number round(number)
9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The round function returns the number that is closest to the
9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument and that is an integer. If there are two such numbers,
9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the one that is even is returned.
9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) {
9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double f;
9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(1);
9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_NUMBER;
9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE(XPATH_NUMBER);
9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlXPathIsNaN(ctxt->value->floatval)) ||
9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlXPathIsInf(ctxt->value->floatval) == 1) ||
9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlXPathIsInf(ctxt->value->floatval) == -1) ||
9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->value->floatval == 0.0))
9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XTRUNC(f, ctxt->value->floatval);
9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value->floatval < 0) {
9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval < f - 0.5)
9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f - 1;
9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f;
9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval == 0)
9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = xmlXPathNZERO;
9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value->floatval < f + 0.5)
9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f;
9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->value->floatval = f + 1;
9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			The Parser					*
9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a few forward declarations since we use a recursive call based
9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation.
9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort);
9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter);
9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt);
9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt);
9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt,
9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                  int qualified);
9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCurrentChar:
9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context
9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  pointer to the beginning of the char
9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  pointer to the length of the char read
9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple
9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer.
9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length
9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) {
9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char c;
9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int val;
9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->cur;
9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * We are supposed to handle UTF8, check it's valid
9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * From rfc2044: encoding of the Unicode values on UTF-8:
9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * UCS-4 range (hex.)           UTF-8 octet sequence (binary)
9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 0000 0000-0000 007F   0xxxxxxx
9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 0000 0080-0000 07FF   110xxxxx 10xxxxxx
9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check for the 0x110000 limit too
9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = *cur;
9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (c & 0x80) {
9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur[1] & 0xc0) != 0x80)
9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto encoding_error;
9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((c & 0xe0) == 0xe0) {
9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur[2] & 0xc0) != 0x80)
9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto encoding_error;
9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c & 0xf0) == 0xf0) {
9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((c & 0xf8) != 0xf0) ||
9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((cur[3] & 0xc0) != 0x80))
9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto encoding_error;
9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* 4-byte code */
9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*len = 4;
9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val = (cur[0] & 0x7) << 18;
9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= (cur[1] & 0x3f) << 12;
9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= (cur[2] & 0x3f) << 6;
9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= cur[3] & 0x3f;
9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      /* 3-byte code */
9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*len = 3;
9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val = (cur[0] & 0xf) << 12;
9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= (cur[1] & 0x3f) << 6;
9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val |= cur[2] & 0x3f;
9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  /* 2-byte code */
9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *len = 2;
9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val = (cur[0] & 0x1f) << 6;
9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val |= cur[1] & 0x3f;
9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR(val)) {
9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR0(XPATH_INVALID_CHAR_ERROR);
9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(val);
9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* 1-byte code */
9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*len = 1;
9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((int) *cur);
9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error:
9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If we detect an UTF8 error that probably means that the
9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * input encoding didn't get properly advertised in the
9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * declaration header. Report the error and switch the encoding
9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * to ISO-Latin-1 (if you don't like this policy, just declare the
9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * encoding !)
9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *len = 0;
9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XP_ERROR0(XPATH_ENCODING_ERROR);
9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseNCName:
9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML namespace non qualified name.
9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 3] NCName ::= (Letter | '_') (NCNameChar)*
9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' |
9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                       CombiningChar | Extender
9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL
9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNCName(xmlXPathParserContextPtr ctxt) {
9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *in;
9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count = 0;
9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL);
9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Accelerator for simple ASCII names
9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    in = ctxt->cur;
9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((*in >= 0x61) && (*in <= 0x7A)) ||
9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((*in >= 0x41) && (*in <= 0x5A)) ||
9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*in == '_')) {
9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in++;
9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (((*in >= 0x61) && (*in <= 0x7A)) ||
9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x41) && (*in <= 0x5A)) ||
9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x30) && (*in <= 0x39)) ||
9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == '_') || (*in == '.') ||
9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == '-'))
9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in++;
9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((*in == ' ') || (*in == '>') || (*in == '/') ||
9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (*in == '[') || (*in == ']') || (*in == ':') ||
9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (*in == '@') || (*in == '*')) {
9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    count = in - ctxt->cur;
9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (count == 0)
9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(ctxt->cur, count);
9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cur = in;
9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathParseNameComplex(ctxt, 0));
9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseQName:
9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix:  a xmlChar **
9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML qualified name
9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 5] QName ::= (Prefix ':')? LocalPart
9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 6] Prefix ::= NCName
9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 7] LocalPart ::= NCName
9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the function returns the local part, and prefix is updated
9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   to get the Prefix if any.
9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) {
9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *prefix = NULL;
9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlXPathParseNCName(ctxt);
9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == ':') {
9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *prefix = ret;
9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlXPathParseNCName(ctxt);
9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseName:
9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML name
9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  CombiningChar | Extender
9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)*
9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL
9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseName(xmlXPathParserContextPtr ctxt) {
9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *in;
9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count = 0;
9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL);
9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Accelerator for simple ASCII names
9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    in = ctxt->cur;
9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((*in >= 0x61) && (*in <= 0x7A)) ||
9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((*in >= 0x41) && (*in <= 0x5A)) ||
9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*in == '_') || (*in == ':')) {
9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in++;
9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (((*in >= 0x61) && (*in <= 0x7A)) ||
9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x41) && (*in <= 0x5A)) ||
9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((*in >= 0x30) && (*in <= 0x39)) ||
9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == '_') || (*in == '-') ||
9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*in == ':') || (*in == '.'))
9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in++;
9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((*in > 0) && (*in < 0x80)) {
9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    count = in - ctxt->cur;
9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(ctxt->cur, count);
9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->cur = in;
9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathParseNameComplex(ctxt, 1));
9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) {
9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar buf[XML_MAX_NAMELEN + 5];
9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0, l;
9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int c;
9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Handler for more complex cases
9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = CUR_CHAR(l);
9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (c == '[') || (c == ']') || (c == '@') || /* accelerators */
9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (c == '*') || /* accelerators */
9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!IS_LETTER(c) && (c != '_') &&
9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         ((qualified) && (c != ':')))) {
9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (c == '.') || (c == '-') ||
9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (c == '_') || ((qualified) && (c == ':')) ||
9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_COMBINING(c)) ||
9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_EXTENDER(c)))) {
9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	COPY_BUF(l,buf,len,c);
9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXTL(l);
9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	c = CUR_CHAR(l);
9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len >= XML_MAX_NAMELEN) {
9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Okay someone managed to make a huge name, so he's ready to pay
9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * for the processing speed.
9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *buffer;
9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int max = len * 2;
9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar));
9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (buffer == NULL) {
9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XP_ERRORNULL(XPATH_MEMORY_ERROR);
9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memcpy(buffer, buf, len);
9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */
9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (c == '.') || (c == '-') ||
9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (c == '_') || ((qualified) && (c == ':')) ||
9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (IS_COMBINING(c)) ||
9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (IS_EXTENDER(c))) {
9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len + 10 > max) {
9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    max *= 2;
9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    buffer = (xmlChar *) xmlRealloc(buffer,
9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                            max * sizeof(xmlChar));
9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (buffer == NULL) {
9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_ERRORNULL(XPATH_MEMORY_ERROR);
9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		COPY_BUF(l,buffer,len,c);
9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXTL(l);
9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		c = CUR_CHAR(l);
9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    buffer[len] = 0;
9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(buffer);
9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len == 0)
9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlStrndup(buf, len));
9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_FRAC 20
9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * These are used as divisors for the fractional part of a number.
9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since the table includes 1.0 (representing '0' fractional digits),
9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it must be dimensioned at MAX_FRAC+1 (bug 133921)
9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double my_pow10[MAX_FRAC+1] = {
9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    1.0, 10.0, 100.0, 1000.0, 10000.0,
9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0,
9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0,
9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    100000000000000.0,
9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    1000000000000000.0, 10000000000000000.0, 100000000000000000.0,
9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0
9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringEvalNumber:
9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  A string to scan
9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [30a]  Float  ::= Number ('e' Digits?)?
9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [30]   Number ::=   Digits ('.' Digits?)?
9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | '.' Digits
9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [31]   Digits ::=   [0-9]+
9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number in the string
9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In complement of the Number expression, this function also handles
9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * negative values : '-' Number.
9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the double value.
9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble
9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringEvalNumber(const xmlChar *str) {
9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = str;
9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret;
9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ok = 0;
9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isneg = 0;
9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int exponent = 0;
9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_exponent_negative = 0;
9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long tmp = 0;
9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double temp;
9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return(0);
9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) cur++;
9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) {
9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlXPathNAN);
9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == '-') {
9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isneg = 1;
9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * tmp/temp is a workaround against a gcc compiler bug
9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * http://veillard.com/gcc.bug
9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10;
9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (*cur - '0');
9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (double) tmp;
9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret + temp;
9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10 + (*cur - '0');
9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == '.') {
9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int v, frac = 0;
9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	double fraction = 0;
9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((*cur < '0') || (*cur > '9')) && (!ok)) {
9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathNAN);
9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) {
9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    v = (*cur - '0');
9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fraction = fraction * 10 + v;
9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    frac = frac + 1;
9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fraction /= my_pow10[frac];
9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret + fraction;
9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur >= '0') && (*cur <= '9'))
9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur == 'e') || (*cur == 'E')) {
9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      cur++;
9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      if (*cur == '-') {
9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	is_exponent_negative = 1;
9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      } else if (*cur == '+') {
9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      while ((*cur >= '0') && (*cur <= '9')) {
9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exponent = exponent * 10 + (*cur - '0');
9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) cur++;
9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != 0) return(xmlXPathNAN);
9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isneg) ret = -ret;
9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_exponent_negative) exponent = -exponent;
9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret *= pow(10.0, (double)exponent);
9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNumber:
9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [30]   Number ::=   Digits ('.' Digits?)?
9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | '.' Digits
9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [31]   Digits ::=   [0-9]+
10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number, then push it on the stack
10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNumber(xmlXPathParserContextPtr ctxt)
10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double ret = 0.0;
10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double mult = 1;
10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ok = 0;
10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int exponent = 0;
10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_exponent_negative = 0;
10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long tmp = 0;
10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double temp;
10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) {
10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        XP_ERROR(XPATH_NUMBER_ERROR);
10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * tmp/temp is a workaround against a gcc compiler bug
10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * http://veillard.com/gcc.bug
10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR >= '0') && (CUR <= '9')) {
10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10;
10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (CUR - '0');
10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ok = 1;
10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (double) tmp;
10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret + temp;
10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR >= '0') && (CUR <= '9')) {
10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10 + (CUR - '0');
10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '.') {
10044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (((CUR < '0') || (CUR > '9')) && (!ok)) {
10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            XP_ERROR(XPATH_NUMBER_ERROR);
10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while ((CUR >= '0') && (CUR <= '9')) {
10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mult /= 10;
10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = ret + (CUR - '0') * mult;
10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            NEXT;
10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == 'e') || (CUR == 'E')) {
10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '-') {
10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_exponent_negative = 1;
10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            NEXT;
10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (CUR == '+') {
10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while ((CUR >= '0') && (CUR <= '9')) {
10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            exponent = exponent * 10 + (CUR - '0');
10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            NEXT;
10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (is_exponent_negative)
10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            exponent = -exponent;
10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret *= pow(10.0, (double) exponent);
10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0,
10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlXPathCacheNewFloat(ctxt->context, ret), NULL);
10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseLiteral:
10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal
10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [29]   Literal ::=   '"' [^"]* '"'
10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | "'" [^']* "'"
10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value found or NULL in case of error
10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) {
10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *q;
10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '"') {
10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '"'))
10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '\'') {
10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '\''))
10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERRORNULL(XPATH_START_LITERAL_ERROR);
10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLiteral:
10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal and push it on the stack.
10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [29]   Literal ::=   '"' [^"]* '"'
10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | "'" [^']* "'"
10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: xmlXPathCompLiteral memory allocation could be improved.
10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) {
10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *q;
10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret = NULL;
10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '"') {
10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '"'))
10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '\'') {
10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT;
10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	q = CUR_PTR;
10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_CHAR_CH(CUR)) && (CUR != '\''))
10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_CHAR_CH(CUR)) {
10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrndup(q, CUR_PTR - q);
10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_START_LITERAL_ERROR);
10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) return;
10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0,
10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           xmlXPathCacheNewString(ctxt->context, ret), NULL);
10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ret);
10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompVariableReference:
10167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a VariableReference, evaluate it and push it on the stack.
10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings consist of a mapping from variable names
10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to variable values. The value of a variable is an object, which can be
10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of any of the types that are possible for the value of an expression,
10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and may also be of additional types not specified here.
10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Early evaluation is possible since:
10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings [...] used to evaluate a subexpression are
10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * always the same as those used to evaluate the containing expression.
10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [36]   VariableReference ::=   '$' QName
10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) {
10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *prefix;
10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '$') {
10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_VARIABLE_REF_ERROR);
10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlXPathParseQName(ctxt, &prefix);
10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_VARIABLE_REF_ERROR);
10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->comp->last = -1;
10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0,
10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           name, prefix);
10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) {
10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_UNDEF_VARIABLE_ERROR);
10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNodeType:
10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  a name string
10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is the name given a NodeType one.
10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [38]   NodeType ::=   'comment'
10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | 'text'
10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | 'processing-instruction'
10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                    | 'node'
10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 otherwise
10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNodeType(const xmlChar *name) {
10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "node"))
10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "text"))
10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "comment"))
10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(name, BAD_CAST "processing-instruction"))
10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFunctionCall:
10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [16]   FunctionCall ::=   FunctionName '(' ( Argument ( ',' Argument)*)? ')'
10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [17]   Argument ::=   Expr
10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a function call, the evaluation of all arguments are
10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pushed on the stack
10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) {
10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *prefix;
10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbargs = 0;
10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sort = 1;
10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlXPathParseQName(ctxt, &prefix);
10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR
10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix == NULL)
10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Calling function %s\n",
10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			name);
10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n",
10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prefix, name);
10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '(') {
10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_EXPR_ERROR);
10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Optimization for count(): we don't need the node-set to be sorted.
10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((prefix == NULL) && (name[0] == 'c') &&
10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrEqual(name, BAD_CAST "count"))
10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sort = 0;
10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->comp->last = -1;
10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != ')') {
10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (CUR != 0) {
10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int op1 = ctxt->comp->last;
10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->comp->last = -1;
10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompileExpr(ctxt, sort);
10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR;
10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0);
10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbargs++;
10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR == ')') break;
10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR != ',') {
10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XP_ERROR(XPATH_EXPR_ERROR);
10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0,
10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           name, prefix);
10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPrimaryExpr:
10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [15]   PrimaryExpr ::=   VariableReference
10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                | '(' Expr ')'
10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                | Literal
10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                | Number
10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                | FunctionCall
10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a primary expression.
10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) {
10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '$') xmlXPathCompVariableReference(ctxt);
10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (CUR == '(') {
10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 1);
10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != ')') {
10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_EXPR_ERROR);
10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) {
10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompNumber(ctxt);
10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((CUR == '\'') || (CUR == '"')) {
10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompLiteral(ctxt);
10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompFunctionCall(ctxt);
10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFilterExpr:
10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [20]   FilterExpr ::=   PrimaryExpr
10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *               | FilterExpr Predicate
10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a filter expression.
10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Square brackets are used to filter expressions in the same way that
10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they are used in location paths. It is an error if the expression to
10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be filtered does not evaluate to a node-set. The context node list
10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used for evaluating the expression in square brackets is the node-set
10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be filtered listed in document order.
10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) {
10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompPrimaryExpr(ctxt);
10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '[') {
10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompPredicate(ctxt, 1);
10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathScanName:
10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Trickery: parse an XML name but without consuming the input flow
10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Needed to avoid insanity in the parser state.
10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  CombiningChar | Extender
10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)*
10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] Names ::= Name (S Name)*
10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL
10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathScanName(xmlXPathParserContextPtr ctxt) {
10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0, l;
10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int c;
10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->cur;
10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = CUR_CHAR(l);
10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!IS_LETTER(c) && (c != '_') &&
10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (c != ':'))) {
10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (c == '.') || (c == '-') ||
10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (c == '_') || (c == ':') ||
10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_COMBINING(c)) ||
10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_EXTENDER(c)))) {
10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len += l;
10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXTL(l);
10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	c = CUR_CHAR(l);
10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlStrndup(cur, ctxt->cur - cur);
10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->cur = cur;
10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPathExpr:
10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [19]   PathExpr ::=   LocationPath
10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *               | FilterExpr
10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *               | FilterExpr '/' RelativeLocationPath
10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *               | FilterExpr '//' RelativeLocationPath
10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a path expression.
10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator and // operators combine an arbitrary expression
10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a relative location path. It is an error if the expression
10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * does not evaluate to a node-set.
10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator does composition in the same way as when / is
10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used in a location path. As in location paths, // is short for
10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * /descendant-or-self::node()/.
10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) {
10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int lc = 1;           /* Should we branch to LocationPath ?         */
10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name = NULL; /* we may have to preparse a name to find out */
10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == '$') || (CUR == '(') ||
10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	(IS_ASCII_DIGIT(CUR)) ||
10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (CUR == '\'') || (CUR == '"') ||
10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) {
10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 0;
10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '*') {
10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative or absolute location path */
10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '/') {
10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative or absolute location path */
10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '@') {
10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative abbreviated attribute location path */
10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '.') {
10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* relative abbreviated attribute location path */
10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lc = 1;
10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Problem is finding if we have a name here whether it's:
10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - a nodetype
10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - a function call in which case it's followed by '('
10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - an axis in which case it's followed by ':'
10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *   - a element name
10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * We do an a priori analysis here rather than having to
10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * maintain parsed token content through the recursive function
10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * calls. This looks uglier but makes the code easier to
10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * read/write/debug.
10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathScanName(ctxt);
10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) {
10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "PathExpr: Axis\n");
10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lc = 1;
10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (name != NULL) {
10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int len =xmlStrlen(name);
10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (NXT(len) != 0) {
10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (NXT(len) == '/') {
10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* element name */
10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "PathExpr: AbbrRelLocation\n");
10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (IS_BLANK_CH(NXT(len))) {
10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* ignore blanks */
10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ;
10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (NXT(len) == ':') {
10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "PathExpr: AbbrRelLocation\n");
10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((NXT(len) == '(')) {
10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Note Type or Function */
10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlXPathIsNodeType(name)) {
10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlGenericError(xmlGenericErrorContext,
10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"PathExpr: Type search\n");
10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lc = 1;
10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlGenericError(xmlGenericErrorContext,
10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"PathExpr: function call\n");
10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lc = 0;
10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((NXT(len) == '[')) {
10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* element name */
10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "PathExpr: AbbrRelLocation\n");
10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((NXT(len) == '<') || (NXT(len) == '>') ||
10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (NXT(len) == '=')) {
10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lc = 1;
10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len++;
10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (NXT(len) == 0) {
10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"PathExpr: AbbrRelLocation\n");
10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* element name */
10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lc = 1;
10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* make sure all cases are covered explicitly */
10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR(XPATH_EXPR_ERROR);
10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lc) {
10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '/') {
10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0);
10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompLocationPath(ctxt);
10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompFilterExpr(ctxt);
10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((CUR == '/') && (NXT(1) == '/')) {
10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(2);
10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0);
10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompRelativeLocationPath(ctxt);
10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == '/') {
10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompRelativeLocationPath(ctxt);
10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnionExpr:
10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [18]   UnionExpr ::=   PathExpr
10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *               | UnionExpr '|' PathExpr
10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an union expression.
10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) {
10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompPathExpr(ctxt);
10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '|') {
10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompPathExpr(ctxt);
10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0);
10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnaryExpr:
10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [27]   UnaryExpr ::=   UnionExpr
10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                   | '-' UnaryExpr
10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an unary expression.
10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) {
10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int minus = 0;
10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int found = 0;
10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '-') {
10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        minus = 1 - minus;
10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	found = 1;
10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompUnionExpr(ctxt);
10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (found) {
10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (minus)
10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0);
10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0);
10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompMultiplicativeExpr:
10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [26]   MultiplicativeExpr ::=   UnaryExpr
10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                   | MultiplicativeExpr MultiplyOperator UnaryExpr
10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                   | MultiplicativeExpr 'div' UnaryExpr
10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                   | MultiplicativeExpr 'mod' UnaryExpr
10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [34]   MultiplyOperator ::=   '*'
10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression.
10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) {
10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompUnaryExpr(ctxt);
10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '*') ||
10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) ||
10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) {
10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op = -1;
10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '*') {
10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = 0;
10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == 'd') {
10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = 1;
10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(3);
10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == 'm') {
10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    op = 2;
10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(3);
10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompUnaryExpr(ctxt);
10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0);
10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAdditiveExpr:
10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [25]   AdditiveExpr ::=   MultiplicativeExpr
10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                   | AdditiveExpr '+' MultiplicativeExpr
10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                   | AdditiveExpr '-' MultiplicativeExpr
10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression.
10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) {
10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompMultiplicativeExpr(ctxt);
10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '+') || (CUR == '-')) {
10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int plus;
10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '+') plus = 1;
10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else plus = 0;
10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompMultiplicativeExpr(ctxt);
10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0);
10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelationalExpr:
10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [24]   RelationalExpr ::=   AdditiveExpr
10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | RelationalExpr '<' AdditiveExpr
10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | RelationalExpr '>' AdditiveExpr
10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | RelationalExpr '<=' AdditiveExpr
10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | RelationalExpr '>=' AdditiveExpr
10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  A <= B > C is allowed ? Answer from James, yes with
10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  (AdditiveExpr <= AdditiveExpr) > AdditiveExpr
10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  which is basically what got implemented.
10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Relational expression, then push the result
10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the stack
10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) {
10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompAdditiveExpr(ctxt);
10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '<') ||
10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           (CUR == '>') ||
10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == '<') && (NXT(1) == '=')) ||
10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((CUR == '>') && (NXT(1) == '='))) {
10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int inf, strict;
10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '<') inf = 1;
10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else inf = 0;
10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (NXT(1) == '=') strict = 0;
10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else strict = 1;
10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!strict) NEXT;
10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompAdditiveExpr(ctxt);
10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict);
10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompEqualityExpr:
10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [23]   EqualityExpr ::=   RelationalExpr
10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | EqualityExpr '=' RelationalExpr
10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | EqualityExpr '!=' RelationalExpr
10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  A != B != C is allowed ? Answer from James, yes with
10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  (RelationalExpr = RelationalExpr) = RelationalExpr
10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  (RelationalExpr != RelationalExpr) != RelationalExpr
10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  which is basically what got implemented.
10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Equality expression.
10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) {
10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompRelationalExpr(ctxt);
10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) {
10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int eq;
10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (CUR == '=') eq = 1;
10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else eq = 0;
10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!eq) NEXT;
10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompRelationalExpr(ctxt);
10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0);
10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAndExpr:
10794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [22]   AndExpr ::=   EqualityExpr
10797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | AndExpr 'and' EqualityExpr
10798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an AND expression.
10800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) {
10804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompEqualityExpr(ctxt);
10805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) {
10808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        SKIP(3);
10810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompEqualityExpr(ctxt);
10812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0);
10814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompileExpr:
10820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [14]   Expr ::=   OrExpr
10823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [21]   OrExpr ::=   AndExpr
10824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                 | OrExpr 'or' AndExpr
10825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and compile an expression
10827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) {
10830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompAndExpr(ctxt);
10831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == 'o') && (NXT(1) == 'r')) {
10834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1 = ctxt->comp->last;
10835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        SKIP(2);
10836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompAndExpr(ctxt);
10838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
10839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0);
10840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	op1 = ctxt->comp->nbStep;
10841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) {
10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* more ops could be optimized too */
10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* This is the main place to eliminate sorting for
10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* operations which don't require a sorted node-set.
10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* E.g. count().
10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0);
10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPredicate:
10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filter:  act as a filter
10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [8]   Predicate ::=   '[' PredicateExpr ']'
10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [9]   PredicateExpr ::=   Expr
10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a predicate expression
10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) {
10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int op1 = ctxt->comp->last;
10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '[') {
10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->comp->last = -1;
10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This call to xmlXPathCompileExpr() will deactivate sorting
10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of the predicate result.
10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Sorting is still activated for filters, since I'm not
10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  sure if needed. Normally sorting should not be needed, since
10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  a filter can only diminish the number of items in a sequence,
10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  but won't change its order; so if the initial sequence is sorted,
10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  subsequent sorting is not needed.
10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! filter)
10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 0);
10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 1);
10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != ']') {
10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (filter)
10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0);
10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0);
10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNodeTest:
10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test:  pointer to a xmlXPathTestVal
10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  pointer to a xmlXPathTypeVal
10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix:  placeholder for a possible name prefix
10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7] NodeTest ::=   NameTest
10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | NodeType '(' ')'
10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | 'processing-instruction' '(' Literal ')'
10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] NameTest ::=  '*'
10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | NCName ':' '*'
10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		    | QName
10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [38] NodeType ::= 'comment'
10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		   | 'text'
10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		   | 'processing-instruction'
10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		   | 'node'
10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the name found and updates @test, @type and @prefix appropriately
10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test,
10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	             xmlXPathTypeVal *type, const xmlChar **prefix,
10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlChar *name) {
10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int blanks;
10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((test == NULL) || (type == NULL) || (prefix == NULL)) {
10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	STRANGE;
10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *type = (xmlXPathTypeVal) 0;
10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *test = (xmlXPathTestVal) 0;
10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *prefix = NULL;
10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) && (CUR == '*')) {
10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * All elements
10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*test = NODE_TEST_ALL;
10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathParseNCName(ctxt);
10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XP_ERRORNULL(XPATH_EXPR_ERROR);
10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    blanks = IS_BLANK_CH(CUR);
10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '(') {
10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * NodeType or PI search
10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(name, BAD_CAST "comment"))
10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_COMMENT;
10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlStrEqual(name, BAD_CAST "node"))
10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_NODE;
10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlStrEqual(name, BAD_CAST "processing-instruction"))
10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_PI;
10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (xmlStrEqual(name, BAD_CAST "text"))
10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *type = NODE_TYPE_TEXT;
10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_EXPR_ERROR);
10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*test = NODE_TEST_TYPE;
10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*type == NODE_TYPE_PI) {
10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Specific case: search a PI by name.
10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = NULL;
10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR != ')') {
10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = xmlXPathParseLiteral(ctxt);
10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR NULL;
10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*test = NODE_TEST_PI;
10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != ')') {
10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL)
10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_UNCLOSED_ERROR);
10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(name);
11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *test = NODE_TEST_NAME;
11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!blanks) && (CUR == ':')) {
11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Since currently the parser context don't have a
11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * namespace list associated:
11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * The namespace name for this prefix can be computed
11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * only at evaluation time. The compilation is done
11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * outside of any context.
11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*prefix = xmlXPathNsLookup(ctxt->context, name);
11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (name != NULL)
11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(name);
11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*prefix == NULL) {
11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
11020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*prefix = name;
11021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '*') {
11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * All elements
11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *test = NODE_TEST_ALL;
11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathParseNCName(ctxt);
11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (name == NULL) {
11034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XP_ERRORNULL(XPATH_EXPR_ERROR);
11035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(name);
11038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAxisName:
11042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  a preparsed name token
11043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] AxisName ::=   'ancestor'
11045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'ancestor-or-self'
11046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'attribute'
11047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'child'
11048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'descendant'
11049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'descendant-or-self'
11050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'following'
11051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'following-sibling'
11052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'namespace'
11053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'parent'
11054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'preceding'
11055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'preceding-sibling'
11056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | 'self'
11057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the axis or 0
11059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathAxisVal
11061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAxisName(const xmlChar *name) {
11062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathAxisVal ret = (xmlXPathAxisVal) 0;
11063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (name[0]) {
11064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'a':
11065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "ancestor"))
11066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_ANCESTOR;
11067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "ancestor-or-self"))
11068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_ANCESTOR_OR_SELF;
11069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "attribute"))
11070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_ATTRIBUTE;
11071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'c':
11073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "child"))
11074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_CHILD;
11075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'd':
11077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "descendant"))
11078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_DESCENDANT;
11079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "descendant-or-self"))
11080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_DESCENDANT_OR_SELF;
11081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'f':
11083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "following"))
11084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_FOLLOWING;
11085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "following-sibling"))
11086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_FOLLOWING_SIBLING;
11087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'n':
11089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "namespace"))
11090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_NAMESPACE;
11091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 'p':
11093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "parent"))
11094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_PARENT;
11095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "preceding"))
11096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_PRECEDING;
11097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "preceding-sibling"))
11098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_PRECEDING_SIBLING;
11099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case 's':
11101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(name, BAD_CAST "self"))
11102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = AXIS_SELF;
11103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
11104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
11106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompStep:
11110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] Step ::=   AxisSpecifier NodeTest Predicate*
11113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | AbbreviatedStep
11114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] AbbreviatedStep ::=   '.' | '..'
11116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] AxisSpecifier ::= AxisName '::'
11118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                  | AbbreviatedAxisSpecifier
11119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13] AbbreviatedAxisSpecifier ::= '@'?
11121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified for XPtr range support as:
11123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [4xptr] Step ::= AxisSpecifier NodeTest Predicate*
11125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | AbbreviatedStep
11126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | 'range-to' '(' Expr ')' Predicate*
11127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile one step in a Location Path
11129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A location step of . is short for self::node(). This is
11130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * particularly useful in conjunction with //. For example, the
11131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location path .//para is short for
11132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * self::node()/descendant-or-self::node()/child::para
11133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select all para descendant elements of the context
11134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node.
11135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Similarly, a location step of .. is short for parent::node().
11136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For example, ../title is short for parent::node()/child::title
11137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select the title children of the parent of the context
11138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node.
11139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompStep(xmlXPathParserContextPtr ctxt) {
11142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int rangeto = 0;
11144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int op2 = -1;
11145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == '.') && (NXT(1) == '.')) {
11149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP(2);
11150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT,
11152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '.') {
11154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
11155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *name = NULL;
11158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *prefix = NULL;
11159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathTestVal test = (xmlXPathTestVal) 0;
11160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathAxisVal axis = (xmlXPathAxisVal) 0;
11161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathTypeVal type = (xmlXPathTypeVal) 0;
11162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int op1;
11163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * The modification needed for XPointer change to the production
11166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
11167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->xptr) {
11169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = xmlXPathParseNCName(ctxt);
11170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) {
11171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                op2 = ctxt->comp->last;
11172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(name);
11173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (CUR != '(') {
11175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_ERROR(XPATH_EXPR_ERROR);
11176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompileExpr(ctxt, 1);
11181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */
11182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR;
11183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (CUR != ')') {
11186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XP_ERROR(XPATH_EXPR_ERROR);
11187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rangeto = 1;
11190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto eval_predicates;
11191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '*') {
11195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    axis = AXIS_CHILD;
11196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name == NULL)
11198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = xmlXPathParseNCName(ctxt);
11199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (name != NULL) {
11200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		axis = xmlXPathIsAxisName(name);
11201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (axis != 0) {
11202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    SKIP_BLANKS;
11203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((CUR == ':') && (NXT(1) == ':')) {
11204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			SKIP(2);
11205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(name);
11206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			name = NULL;
11207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
11208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* an element name can conflict with an axis one :-\ */
11209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			axis = AXIS_CHILD;
11210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
11211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
11212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    axis = AXIS_CHILD;
11213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (CUR == '@') {
11215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		axis = AXIS_ATTRIBUTE;
11217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		axis = AXIS_CHILD;
11219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR;
11223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name);
11225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (test == 0)
11226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
11227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((prefix != NULL) && (ctxt->context != NULL) &&
11229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->context->flags & XML_XPATH_CHECKNS)) {
11230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) {
11231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR);
11232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
11236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Basis : computing new set\n");
11237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Basis : ");
11241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->value == NULL)
11242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "no value\n");
11243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (ctxt->value->nodesetval == NULL)
11244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "Empty\n");
11245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
11246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval);
11247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecteval_predicates:
11251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	op1 = ctxt->comp->last;
11253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->comp->last = -1;
11254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (CUR == '[') {
11257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompPredicate(ctxt, 0);
11258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (rangeto) {
11262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0);
11263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
11264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis,
11266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   test, type, (void *)prefix, (void *)name);
11267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Step : ");
11271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL)
11272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "no value\n");
11273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (ctxt->value->nodesetval == NULL)
11274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "Empty\n");
11275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
11276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericErrorContextNodeSet(xmlGenericErrorContext,
11277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->value->nodesetval);
11278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelativeLocationPath:
11283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [3]   RelativeLocationPath ::=   Step
11286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | RelativeLocationPath '/' Step
11287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | AbbreviatedRelativeLocationPath
11288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [11]  AbbreviatedRelativeLocationPath ::=   RelativeLocationPath '//' Step
11289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a relative location path.
11291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelativeLocationPath
11294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(xmlXPathParserContextPtr ctxt) {
11295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR == '/') && (NXT(1) == '/')) {
11297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP(2);
11298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		         NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '/') {
11302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
11303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompStep(ctxt);
11306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '/') {
11308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((CUR == '/') && (NXT(1) == '/')) {
11309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP(2);
11310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
11311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompStep(ctxt);
11314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR == '/') {
11315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
11316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS;
11317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompStep(ctxt);
11318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS;
11320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLocationPath:
11325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
11326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [1]   LocationPath ::=   RelativeLocationPath
11328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | AbsoluteLocationPath
11329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [2]   AbsoluteLocationPath ::=   '/' RelativeLocationPath?
11330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                     | AbbreviatedAbsoluteLocationPath
11331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  [10]   AbbreviatedAbsoluteLocationPath ::=
11332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                           '//' RelativeLocationPath
11333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a location path
11335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * // is short for /descendant-or-self::node()/. For example,
11337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * //para is short for /descendant-or-self::node()/child::para and
11338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so will select any para element in the document (even a para element
11339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is a document element will be selected by //para since the
11340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document element node is a child of the root node); div//para is
11341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * short for div/descendant-or-self::node()/child::para and so will
11342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * select all para descendants of div children.
11343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) {
11346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS;
11347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '/') {
11348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathCompRelativeLocationPath(ctxt);
11349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (CUR == '/') {
11351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((CUR == '/') && (NXT(1) == '/')) {
11352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP(2);
11353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL);
11356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompRelativeLocationPath(ctxt);
11357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (CUR == '/') {
11358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
11359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		SKIP_BLANKS;
11360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((CUR != 0 ) &&
11361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') ||
11362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (CUR == '@') || (CUR == '*')))
11363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCompRelativeLocationPath(ctxt);
11364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
11370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
11371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		XPath precompiled expression evaluation			*
11372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
11373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
11374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op);
11377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
11380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpStepAxis(xmlXPathAxisVal axis,
11381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlXPathTestVal test,
11382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  int nbNodes)
11383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "new step : ");
11385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (axis) {
11386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR:
11387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' ");
11388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR_OR_SELF:
11390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'ancestors-or-self' ");
11392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ATTRIBUTE:
11394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'attributes' ");
11395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_CHILD:
11397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'child' ");
11398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT:
11400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'descendant' ");
11401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT_OR_SELF:
11403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'descendant-or-self' ");
11405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING:
11407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'following' ");
11408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING_SIBLING:
11410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'following-siblings' ");
11412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_NAMESPACE:
11414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'namespace' ");
11415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PARENT:
11417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'parent' ");
11418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING:
11420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'preceding' ");
11421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING_SIBLING:
11423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "axis 'preceding-sibling' ");
11425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_SELF:
11427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "axis 'self' ");
11428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
11431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	" context contains %d nodes\n", nbNodes);
11432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (test) {
11433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_NONE:
11434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for none !!!\n");
11436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_TYPE:
11438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for type %d\n", type);
11440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_PI:
11442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for PI !!!\n");
11444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_ALL:
11446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for *\n");
11448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_NS:
11450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for namespace %s\n",
11452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            prefix);
11453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case NODE_TEST_NAME:
11455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
11456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "           searching for name %s\n", name);
11457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (prefix != NULL)
11458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext,
11459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                "           with namespace %s\n", prefix);
11460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Testing : ");
11463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* DEBUG_STEP */
11465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt,
11468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
11469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlNodeSetPtr set,
11470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int contextSize,
11471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int hasNsNodes)
11472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1) {
11474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompExprPtr comp = ctxt->comp;
11475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Process inner predicates first.
11477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) {
11479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: raise an internal error.
11481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	contextSize = xmlXPathCompOpEvalPredicate(ctxt,
11484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &comp->steps[op->ch1], set, contextSize, hasNsNodes);
11485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR0;
11486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextSize <= 0)
11487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
11488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1) {
11490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextPtr xpctxt = ctxt->context;
11491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr contextNode, oldContextNode;
11492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDocPtr oldContextDoc;
11493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, res, contextPos = 0, newContextSize;
11494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathStepOpPtr exprOp;
11495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr contextObj = NULL, exprRes = NULL;
11496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: Check the following:
11500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  We don't expect location sets if evaluating prediates, right?
11501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  Only filters should expect location sets, right?
11502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC XPath 1.0:
11506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  "For each node in the node-set to be filtered, the
11507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  PredicateExpr is evaluated with that node as the
11508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  context node, with the number of nodes in the
11509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  node-set as the context size, and with the proximity
11510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  position of the node in the node-set with respect to
11511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  the axis as the context position;"
11512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* @oldset is the node-set" to be filtered.
11513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC XPath 1.0:
11515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  "only predicates change the context position and
11516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*  context size (see [2.4 Predicates])."
11517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Example:
11518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   node-set  context pos
11519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nA         1
11520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nB         2
11521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nC         3
11522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   After applying predicate [position() > 1] :
11523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   node-set  context pos
11524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nB         1
11525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    nC         2
11526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextNode = xpctxt->node;
11528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextDoc = xpctxt->doc;
11529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the expression of this predicate.
11531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exprOp = &ctxt->comp->steps[op->ch2];
11533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newContextSize = 0;
11534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < set->nodeNr; i++) {
11535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set->nodeTab[i] == NULL)
11536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
11537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    contextNode = set->nodeTab[i];
11539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextNode;
11540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->contextSize = contextSize;
11541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->proximityPosition = ++contextPos;
11542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Also set the xpath document in case things like
11545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * key() are evaluated in the predicate.
11546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((contextNode->type != XML_NAMESPACE_DECL) &&
11548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(contextNode->doc != NULL))
11549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xpctxt->doc = contextNode->doc;
11550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate the predicate expression with 1 context node
11552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * at a time; this node is packaged into a node set; this
11553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * node set is handed over to the evaluation mechanism.
11554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextObj == NULL)
11556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode);
11557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
11558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(contextObj->nodesetval,
11559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    contextNode);
11560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, contextObj);
11562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1);
11564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) {
11566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(set, hasNsNodes);
11567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newContextSize = 0;
11568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto evaluation_exit;
11569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 0) {
11572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newContextSize++;
11573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Remove the entry from the initial node set.
11576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set->nodeTab[i] = NULL;
11578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (contextNode->type == XML_NAMESPACE_DECL)
11579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode);
11580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj) {
11582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't free the temporary XPath object holding the
11584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* context node, in order to avoid massive recreation
11585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* inside this loop.
11586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes);
11589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: The object was lost in the evaluation machinery.
11592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  Can this happen? Maybe in internal-error cases.
11593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = NULL;
11595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextObj != NULL) {
11599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj)
11600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(xpctxt, contextObj);
11602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit:
11604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exprRes != NULL)
11605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, exprRes);
11606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Reset/invalidate the context.
11608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->node = oldContextNode;
11610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->doc = oldContextDoc;
11611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->contextSize = -1;
11612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->proximityPosition = -1;
11613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(newContextSize);
11614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(contextSize);
11616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt,
11620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlXPathStepOpPtr op,
11621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlNodeSetPtr set,
11622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int contextSize,
11623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int minPos,
11624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int maxPos,
11625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      int hasNsNodes)
11626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1) {
11628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompExprPtr comp = ctxt->comp;
11629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) {
11630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: raise an internal error.
11632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	contextSize = xmlXPathCompOpEvalPredicate(ctxt,
11635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &comp->steps[op->ch1], set, contextSize, hasNsNodes);
11636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR0;
11637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextSize <= 0)
11638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
11639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check if the node set contains a sufficient number of nodes for
11642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the requested range.
11643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (contextSize < minPos) {
11645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetClear(set, hasNsNodes);
11646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
11647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 == -1) {
11649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Can this ever happen?
11651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (contextSize);
11653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDocPtr oldContextDoc;
11655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, pos = 0, newContextSize = 0, contextPos = 0, res;
11656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathStepOpPtr exprOp;
11657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr contextObj = NULL, exprRes = NULL;
11658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr oldContextNode, contextNode = NULL;
11659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathContextPtr xpctxt = ctxt->context;
11660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
11662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * URGENT TODO: Check the following:
11664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  We don't expect location sets if evaluating prediates, right?
11665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Only filters should expect location sets, right?
11666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
11668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Save old context.
11671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextNode = xpctxt->node;
11673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldContextDoc = xpctxt->doc;
11674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the expression of this predicate.
11676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exprOp = &ctxt->comp->steps[op->ch2];
11678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < set->nodeNr; i++) {
11679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (set->nodeTab[i] == NULL)
11680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
11681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    contextNode = set->nodeTab[i];
11683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextNode;
11684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->contextSize = contextSize;
11685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->proximityPosition = ++contextPos;
11686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Initialize the new set.
11689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Also set the xpath document in case things like
11690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * key() evaluation are attempted on the predicate
11691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((contextNode->type != XML_NAMESPACE_DECL) &&
11693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(contextNode->doc != NULL))
11694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xpctxt->doc = contextNode->doc;
11695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate the predicate expression with 1 context node
11697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * at a time; this node is packaged into a node set; this
11698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * node set is handed over to the evaluation mechanism.
11699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextObj == NULL)
11701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode);
11702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
11703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(contextObj->nodesetval,
11704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    contextNode);
11705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, contextObj);
11707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1);
11708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) {
11710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlXPathObjectPtr tmp;
11711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* pop the result */
11712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = valuePop(ctxt);
11713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(xpctxt, tmp);
11714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* then pop off contextObj, which will be freed later */
11715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto evaluation_error;
11717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res)
11720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pos++;
11721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res && (pos >= minPos) && (pos <= maxPos)) {
11723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Fits in the requested range.
11725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newContextSize++;
11727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (minPos == maxPos) {
11728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
11729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Only 1 node was requested.
11730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
11731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (contextNode->type == XML_NAMESPACE_DECL) {
11732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
11733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* As always: take care of those nasty
11734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* namespace nodes.
11735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
11736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			set->nodeTab[i] = NULL;
11737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
11738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetClear(set, hasNsNodes);
11739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeNr = 1;
11740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set->nodeTab[0] = contextNode;
11741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto evaluation_exit;
11742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pos == maxPos) {
11744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
11745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * We are done.
11746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
11747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes);
11748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto evaluation_exit;
11749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Remove the entry from the initial node set.
11753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set->nodeTab[i] = NULL;
11755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (contextNode->type == XML_NAMESPACE_DECL)
11756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode);
11757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exprRes != NULL) {
11759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, exprRes);
11760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exprRes = NULL;
11761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj) {
11763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't free the temporary XPath object holding the
11765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* context node, in order to avoid massive recreation
11766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* inside this loop.
11767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes);
11770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The object was lost in the evaluation machinery.
11773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Can this happen? Maybe in case of internal-errors.
11774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextObj = NULL;
11776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto evaluation_exit;
11779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_error:
11781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetClear(set, hasNsNodes);
11782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newContextSize = 0;
11783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit:
11785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (contextObj != NULL) {
11786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == contextObj)
11787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
11788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(xpctxt, contextObj);
11789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exprRes != NULL)
11791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, exprRes);
11792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Reset/invalidate the context.
11794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->node = oldContextNode;
11796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->doc = oldContextDoc;
11797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->contextSize = -1;
11798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->proximityPosition = -1;
11799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(newContextSize);
11800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(contextSize);
11802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt,
11806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
11807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int *maxPos)
11808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOpPtr exprOp;
11811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * BIG NOTE: This is not intended for XPATH_OP_FILTER yet!
11814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If not -1, then ch1 will point to:
11818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1) For predicates (XPATH_OP_PREDICATE):
11819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    - an inner predicate operator
11820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2) For filters (XPATH_OP_FILTER):
11821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    - an inner filter operater OR
11822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    - an expression selecting the node set.
11823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *      E.g. "key('a', 'b')" or "(//foo | //bar)".
11824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER))
11826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
11827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1) {
11829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exprOp = &ctxt->comp->steps[op->ch2];
11830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
11831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
11832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exprOp != NULL) &&
11834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(exprOp->op == XPATH_OP_VALUE) &&
11835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(exprOp->value4 != NULL) &&
11836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER))
11837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
11838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We have a "[n]" predicate here.
11840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Unfortunately this simplistic test here is not
11841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* able to detect a position() predicate in compound
11842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* expressions like "[@attr = 'a" and position() = 1],
11843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and even not the usage of position() in
11844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "[position() = 1]"; thus - obviously - a position-range,
11845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* like it "[position() < 5]", is also not detected.
11846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Maybe we could rewrite the AST to ease the optimization.
11847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval;
11849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((xmlXPathObjectPtr) exprOp->value4)->floatval ==
11851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (float) *maxPos)
11852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
11853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
11854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
11861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlXPathStepOpPtr op,
11862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr * first, xmlNodePtr * last,
11863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   int toBool)
11864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT \
11867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasAxisRange != 0) { \
11868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (++pos == maxPos) { \
11869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    addNode(seq, cur); \
11870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto axis_range_end; } \
11871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else { \
11872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	addNode(seq, cur); \
11873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (breakOnFirstHit) goto first_hit; }
11874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT_NS \
11876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasAxisRange != 0) { \
11877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (++pos == maxPos) { \
11878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    hasNsNodes = 1; \
11879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur); \
11880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto axis_range_end; } \
11881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else { \
11882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hasNsNodes = 1; \
11883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathNodeSetAddNs(seq, \
11884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpctxt->node, (xmlNsPtr) cur); \
11885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (breakOnFirstHit) goto first_hit; }
11886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value;
11888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTestVal test = (xmlXPathTestVal) op->value2;
11889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3;
11890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *prefix = op->value4;
11891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = op->value5;
11892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *URI = NULL;
11893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
11895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbMatches = 0, prevMatches = 0;
11896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0, hasNsNodes = 0;
11898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The popped object holding the context nodes */
11899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
11900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The set of context nodes for the node tests */
11901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr contextSeq;
11902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int contextIdx;
11903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr contextNode;
11904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The context node for a compound traversal */
11905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr outerContextNode;
11906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The final resulting node set wrt to all context nodes */
11907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr outSeq;
11908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The temporary resulting node set wrt 1 context node.
11910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Used to feed predicate evaluation.
11911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr seq;
11913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
11914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* First predicate operator */
11915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathStepOpPtr predOp;
11916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxPos; /* The requested position() (when a "[n]" predicate) */
11917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasPredicateRange, hasAxisRange, pos, size, newSize;
11918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int breakOnFirstHit;
11919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTraversalFunction next = NULL;
11921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* compound axis traversal */
11922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathTraversalFunctionExt outerNext = NULL;
11923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void (*addNode) (xmlNodeSetPtr, xmlNodePtr);
11924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathNodeSetMergeFunction mergeAndClear;
11925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr oldContextNode;
11926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathContextPtr xpctxt = ctxt->context;
11927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE0(XPATH_NODESET);
11930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
11931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Setup namespaces.
11933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix != NULL) {
11935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        URI = xmlXPathNsLookup(xpctxt, prefix);
11936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (URI == NULL) {
11937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(xpctxt, obj);
11938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
11939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Setup axis.
11943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
11944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * MAYBE FUTURE TODO: merging optimizations:
11945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * - If the nodes to be traversed wrt to the initial nodes and
11946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   the current axis cannot overlap, then we could avoid searching
11947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   for duplicates during the merge.
11948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   But the question is how/when to evaluate if they cannot overlap.
11949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   Example: if we know that for two initial nodes, the one is
11950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   not in the ancestor-or-self axis of the other, then we could safely
11951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   avoid a duplicate-aware merge, if the axis to be traversed is e.g.
11952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   the descendant-or-self axis.
11953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    addNode = xmlXPathNodeSetAdd;
11955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mergeAndClear = xmlXPathNodeSetMergeAndClear;
11956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (axis) {
11957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR:
11958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
11959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextAncestor;
11960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ANCESTOR_OR_SELF:
11962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
11963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextAncestorOrSelf;
11964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_ATTRIBUTE:
11966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
11967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
11968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextAttribute;
11969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
11970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_CHILD:
11972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
11973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->rewriteType == XP_REWRITE_DOS_CHILD_ELEM) {
11974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This iterator will give us only nodes which can
11976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* hold element nodes.
11977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		outerNext = xmlXPathNextDescendantOrSelfElemParent;
11979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) &&
11981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(type == NODE_TYPE_NODE))
11982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
11983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Optimization if an element node type is 'element'.
11985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		next = xmlXPathNextChildElement;
11987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
11988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		next = xmlXPathNextChild;
11989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
11990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT:
11992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
11993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextDescendant;
11994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_DESCENDANT_OR_SELF:
11996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
11997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextDescendantOrSelf;
11998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
11999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING:
12000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextFollowing;
12002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_FOLLOWING_SIBLING:
12004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextFollowingSibling;
12006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_NAMESPACE:
12008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = (xmlXPathTraversalFunction) xmlXPathNextNamespace;
12011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PARENT:
12014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextParent;
12016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING:
12018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextPrecedingInternal;
12020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_PRECEDING_SIBLING:
12022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextPrecedingSibling;
12024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case AXIS_SELF:
12026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            first = NULL;
12027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = NULL;
12028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = xmlXPathNextSelf;
12029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathDebugDumpStepAxis(axis, test,
12035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(obj->nodesetval != NULL) ? obj->nodsetval->nodeNr : 0);
12036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (next == NULL) {
12039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(xpctxt, obj);
12040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
12041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    contextSeq = obj->nodesetval;
12043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) {
12044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(xpctxt, obj);
12045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL));
12046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
12047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Predicate optimization ---------------------------------------------
12050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If this step has a last predicate, which contains a position(),
12051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then we'll optimize (although not exactly "position()", but only
12052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the  short-hand form, i.e., "[n]".
12053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
12054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Example - expression "/foo[parent::bar][1]":
12055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
12056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * COLLECT 'child' 'name' 'node' foo    -- op (we are here)
12057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   ROOT                               -- op->ch1
12058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   PREDICATE                          -- op->ch2 (predOp)
12059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *     PREDICATE                          -- predOp->ch1 = [parent::bar]
12060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *       SORT
12061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *         COLLECT  'parent' 'name' 'node' bar
12062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *           NODE
12063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *     ELEM Object is a number : 1        -- predOp->ch2 = [1]
12064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
12065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    maxPos = 0;
12067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    predOp = NULL;
12068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hasPredicateRange = 0;
12069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hasAxisRange = 0;
12070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1) {
12071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* There's at least one predicate. 16 == XPATH_OP_PREDICATE
12073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	predOp = &ctxt->comp->steps[op->ch2];
12075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) {
12076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (predOp->ch1 != -1) {
12077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Use the next inner predicate operator.
12079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		predOp = &ctxt->comp->steps[predOp->ch1];
12081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hasPredicateRange = 1;
12082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* There's no other predicate than the [n] predicate.
12085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		predOp = NULL;
12087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hasAxisRange = 1;
12088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0;
12092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Axis traversal -----------------------------------------------------
12094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 2.3 Node Tests
12097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *  - For the attribute axis, the principal node type is attribute.
12098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *  - For the namespace axis, the principal node type is namespace.
12099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *  - For other axes, the principal node type is element.
12100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
12101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * A node test * is true for any node of the
12102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * principal node type. For example, child::* will
12103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * select all element children of the context node
12104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
12105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldContextNode = xpctxt->node;
12106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    addNode = xmlXPathNodeSetAddUnique;
12107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outSeq = NULL;
12108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    seq = NULL;
12109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outerContextNode = NULL;
12110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    contextNode = NULL;
12111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    contextIdx = 0;
12112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) {
12115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (outerNext != NULL) {
12116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is a compound traversal.
12118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextNode == NULL) {
12120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Set the context for the outer traversal.
12122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		outerContextNode = contextSeq->nodeTab[contextIdx++];
12124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextNode = outerNext(NULL, outerContextNode);
12125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
12126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contextNode = outerNext(contextNode, outerContextNode);
12127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (contextNode == NULL)
12128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
12129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Set the context for the main traversal.
12131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextNode;
12133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
12134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpctxt->node = contextSeq->nodeTab[contextIdx++];
12135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (seq == NULL) {
12137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    seq = xmlXPathNodeSetCreate(NULL);
12138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (seq == NULL) {
12139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total = 0;
12140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;
12141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Traverse the axis and test the nodes.
12145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pos = 0;
12147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = NULL;
12148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hasNsNodes = 0;
12149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
12150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = next(ctxt, cur);
12151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
12152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
12153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * QUESTION TODO: What does the "first" and "last" stuff do?
12156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((first != NULL) && (*first != NULL)) {
12158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*first == cur)
12159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((total % 256) == 0) &&
12161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
12162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodesExt(*first, cur) >= 0))
12163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
12164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodes(*first, cur) >= 0))
12165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
12167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((last != NULL) && (*last != NULL)) {
12171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*last == cur)
12172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((total % 256) == 0) &&
12174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
12175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodesExt(cur, *last) >= 0))
12176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
12177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlXPathCmpNodes(cur, *last) >= 0))
12178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
12180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total++;
12185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, " %s", cur->name);
12188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (test) {
12191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NONE:
12192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    total = 0;
12193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    STRANGE
12194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
12195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_TYPE:
12196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Don't we need to use
12198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  xmlXPathNodeSetAddNs() for namespace nodes here?
12199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  Surprisingly, some c14n tests fail, if we do this.
12200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type == NODE_TYPE_NODE) {
12202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			switch (cur->type) {
12203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_DOCUMENT_NODE:
12204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_HTML_DOCUMENT_NODE:
12205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
12206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_DOCB_DOCUMENT_NODE:
12207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_ELEMENT_NODE:
12209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_ATTRIBUTE_NODE:
12210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_PI_NODE:
12211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_COMMENT_NODE:
12212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_CDATA_SECTION_NODE:
12213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_TEXT_NODE:
12214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    case XML_NAMESPACE_DECL:
12215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XP_TEST_HIT
12216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
12217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    default:
12218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
12219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
12220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (cur->type == type) {
12221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (type == XML_NAMESPACE_DECL)
12222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT_NS
12223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
12224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT
12225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((type == NODE_TYPE_TEXT) &&
12226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 (cur->type == XML_CDATA_SECTION_NODE))
12227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
12228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_TEST_HIT
12229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
12230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_PI:
12232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((cur->type == XML_PI_NODE) &&
12233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ((name == NULL) || xmlStrEqual(name, cur->name)))
12234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
12235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XP_TEST_HIT
12236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
12238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_ALL:
12239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (axis == AXIS_ATTRIBUTE) {
12240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type == XML_ATTRIBUTE_NODE)
12241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
12242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT
12243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (axis == AXIS_NAMESPACE) {
12245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type == XML_NAMESPACE_DECL)
12246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
12247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XP_TEST_HIT_NS
12248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
12250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type == XML_ELEMENT_NODE) {
12251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (prefix == NULL)
12252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    {
12253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XP_TEST_HIT
12254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else if ((cur->ns != NULL) &&
12256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(xmlStrEqual(URI, cur->ns->href)))
12257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    {
12258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XP_TEST_HIT
12259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
12263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NS:{
12264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        TODO;
12265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
12266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case NODE_TEST_NAME:
12268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (axis == AXIS_ATTRIBUTE) {
12269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type != XML_ATTRIBUTE_NODE)
12270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
12271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (axis == AXIS_NAMESPACE) {
12272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->type != XML_NAMESPACE_DECL)
12273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
12274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
12275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (cur->type != XML_ELEMENT_NODE)
12276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
12277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
12278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    switch (cur->type) {
12279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        case XML_ELEMENT_NODE:
12280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (xmlStrEqual(name, cur->name)) {
12281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (prefix == NULL) {
12282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (cur->ns == NULL)
12283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    {
12284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					XP_TEST_HIT
12285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
12286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else {
12287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if ((cur->ns != NULL) &&
12288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        (xmlStrEqual(URI, cur->ns->href)))
12289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    {
12290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					XP_TEST_HIT
12291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
12292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
12293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
12295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        case XML_ATTRIBUTE_NODE:{
12296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlAttrPtr attr = (xmlAttrPtr) cur;
12297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (xmlStrEqual(name, attr->name)) {
12299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (prefix == NULL) {
12300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        if ((attr->ns == NULL) ||
12301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            (attr->ns->prefix == NULL))
12302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					{
12303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    XP_TEST_HIT
12304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        }
12305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    } else {
12306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        if ((attr->ns != NULL) &&
12307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            (xmlStrEqual(URI,
12308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      attr->ns->href)))
12309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					{
12310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    XP_TEST_HIT
12311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        }
12312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
12313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
12314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
12315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
12316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        case XML_NAMESPACE_DECL:
12317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (cur->type == XML_NAMESPACE_DECL) {
12318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlNsPtr ns = (xmlNsPtr) cur;
12319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if ((ns->prefix != NULL) && (name != NULL)
12321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    && (xmlStrEqual(ns->prefix, name)))
12322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				{
12323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    XP_TEST_HIT_NS
12324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
12325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
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                    break;
12331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } /* switch(test) */
12332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
12333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto apply_predicates;
12335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectaxis_range_end: /* ----------------------------------------------------- */
12337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We have a "/foo[n]", and position() = n was reached.
12339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we can have as well "/foo/::parent::foo[1]", so
12340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* a duplicate-aware merge is still needed.
12341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Merge with the result.
12342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (outSeq == NULL) {
12344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = seq;
12345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    seq = NULL;
12346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
12347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = mergeAndClear(outSeq, seq, 0);
12348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Break if only a true/false result was requested.
12350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (toBool)
12352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
12353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	continue;
12354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfirst_hit: /* ---------------------------------------------------------- */
12356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Break if only a true/false result was requested and
12358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* no predicates existed and a node test succeeded.
12359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (outSeq == NULL) {
12361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = seq;
12362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    seq = NULL;
12363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
12364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = mergeAndClear(outSeq, seq, 0);
12365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
12366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (seq != NULL)
12369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbMatches += seq->nodeNr;
12370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectapply_predicates: /* --------------------------------------------------- */
12373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
12374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply predicates.
12375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((predOp != NULL) && (seq->nodeNr > 0)) {
12377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * E.g. when we have a "/foo[some expression][n]".
12379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * QUESTION TODO: The old predicate evaluation took into
12382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  account location-sets.
12383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  (E.g. ctxt->value->type == XPATH_LOCATIONSET)
12384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Do we expect such a set here?
12385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  All what I learned now from the evaluation semantics
12386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  does not indicate that a location-set will be processed
12387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  here, so this looks OK.
12388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Iterate over all predicates, starting with the outermost
12391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * predicate.
12392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Problem: we cannot execute the inner predicates first
12393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  since we cannot go back *up* the operator tree!
12394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  Options we have:
12395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  1) Use of recursive functions (like is it currently done
12396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *     via xmlXPathCompOpEval())
12397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  2) Add a predicate evaluation information stack to the
12398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *     context struct
12399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  3) Change the way the operators are linked; we need a
12400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *     "parent" field on xmlXPathStepOp
12401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
12402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * For the moment, I'll try to solve this with a recursive
12403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * function: xmlXPathCompOpEvalPredicate().
12404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    size = seq->nodeNr;
12406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (hasPredicateRange != 0)
12407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt,
12408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    predOp, seq, size, maxPos, maxPos, hasNsNodes);
12409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
12410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		newSize = xmlXPathCompOpEvalPredicate(ctxt,
12411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    predOp, seq, size, hasNsNodes);
12412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK) {
12414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total = 0;
12415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;
12416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add the filtered set of nodes to the result node set.
12419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (newSize == 0) {
12421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The predicates filtered all nodes out.
12423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(seq, hasNsNodes);
12425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (seq->nodeNr > 0) {
12426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Add to result set.
12428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (outSeq == NULL) {
12430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (size != newSize) {
12431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
12432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* We need to merge and clear here, since
12433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the sequence will contained NULLed entries.
12434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
12435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			outSeq = mergeAndClear(NULL, seq, 1);
12436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
12437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			outSeq = seq;
12438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			seq = NULL;
12439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
12440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
12441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    outSeq = mergeAndClear(outSeq, seq,
12442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(size != newSize) ? 1: 0);
12443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Break if only a true/false result was requested.
12445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (toBool)
12447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
12448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (seq->nodeNr > 0) {
12450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add to result set.
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	}
12460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
12463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((obj->boolval) && (obj->user != NULL)) {
12464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* QUESTION TODO: What does this do and why?
12466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Do we have to do this also for the "error"
12467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cleanup further down?
12468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->boolval = 1;
12470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value->user = obj->user;
12471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj->user = NULL;
12472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj->boolval = 0;
12473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(xpctxt, obj);
12475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Ensure we return at least an emtpy set.
12478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (outSeq == NULL) {
12480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((seq != NULL) && (seq->nodeNr == 0))
12481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = seq;
12482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
12483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    outSeq = xmlXPathNodeSetCreate(NULL);
12484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((seq != NULL) && (seq != outSeq)) {
12486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlXPathFreeNodeSet(seq);
12487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Hand over the result. Better to push the set also in
12490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * case of errors.
12491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq));
12493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reset the context node.
12495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xpctxt->node = oldContextNode;
12497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP
12499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
12500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"\nExamined %d nodes, found %d nodes at that step\n",
12501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	total, nbMatches);
12502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(total);
12505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
12509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathStepOpPtr op, xmlNodePtr * first);
12510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalFirst:
12513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
12514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an XPath compiled operation
12515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @first:  the first elem found so far
12516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the first
12518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order
12519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of examined objects.
12521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
12524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathStepOpPtr op, xmlNodePtr * first)
12525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0, cur;
12527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
12528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
12529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
12532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
12533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
12534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
12536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total =
12537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1],
12538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        first);
12539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval->nodeNr >= 1)) {
12544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
12545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * limit tree traversing to first node in the result
12546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
12547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* OPTIMIZE TODO: This implicitely sorts
12549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  the result, even if not needed. E.g. if the argument
12550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  of the count() function, no sorting is needed.
12551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* OPTIMIZE TODO: How do we know if the node-list wasn't
12552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  aready sorted?
12553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->value->nodesetval->nodeNr > 1)
12555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetSort(ctxt->value->nodesetval);
12556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *first = ctxt->value->nodesetval->nodeTab[0];
12557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur =
12559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2],
12560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        first);
12561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
12564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
12567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
12569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    arg2->nodesetval);
12570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
12571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
12572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* optimizer */
12573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (total > cur)
12574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompSwap(op);
12575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total + cur);
12576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
12577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathRoot(ctxt);
12578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
12580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node));
12588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
12590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->context->node = NULL;
12597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT:{
12599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 == -1)
12600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
12601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
12604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0);
12606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
12607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VALUE:
12609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt,
12610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlXPathCacheObjectCopy(ctxt->context,
12611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlXPathObjectPtr) op->value4));
12612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
12614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total +=
12616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1],
12617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            first);
12618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&& (ctxt->value->nodesetval->nodeNr > 1))
12623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathNodeSetSort(ctxt->value->nodesetval);
12624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST
12626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_FILTER:
12627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total =+ xmlXPathCompOpEvalFilterFirst(ctxt, op, first);
12628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
12631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlXPathCompOpEval(ctxt, op));
12632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalLast:
12637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
12638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an XPath compiled operation
12639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @last:  the last elem found so far
12640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the last
12642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order
12643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed
12645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op,
12648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr * last)
12649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0, cur;
12651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
12652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
12653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr bak;
12654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr bakd;
12655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pp;
12656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cs;
12657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
12660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
12661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
12662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
12664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
12665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
12666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
12667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
12668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total =
12669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last);
12670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval->nodeNr >= 1)) {
12675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
12676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * limit tree traversing to first node in the result
12677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
12678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->value->nodesetval->nodeNr > 1)
12679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetSort(ctxt->value->nodesetval);
12680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *last =
12681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->value->nodesetval->nodeTab[ctxt->value->
12682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     nodesetval->nodeNr -
12683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     1];
12684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
12686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
12687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
12688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
12689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur =
12690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last);
12691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */
12696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
12699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
12701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
12702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
12704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    arg2->nodesetval);
12705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
12706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
12707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* optimizer */
12708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (total > cur)
12709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompSwap(op);
12710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total + cur);
12711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
12712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathRoot(ctxt);
12713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
12715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node));
12723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
12725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
12729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->context->node = NULL;
12732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT:{
12734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 == -1)
12735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (0);
12736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
12739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0);
12741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
12742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VALUE:
12744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt,
12745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlXPathCacheObjectCopy(ctxt->context,
12746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlXPathObjectPtr) op->value4));
12747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
12748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
12749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
12750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total +=
12751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1],
12752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           last);
12753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL)
12755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->type == XPATH_NODESET)
12756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (ctxt->value->nodesetval != NULL)
12757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&& (ctxt->value->nodesetval->nodeNr > 1))
12758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathNodeSetSort(ctxt->value->nodesetval);
12759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
12760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
12761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlXPathCompOpEval(ctxt, op));
12762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST
12766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
12768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathStepOpPtr op, xmlNodePtr * first)
12769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0;
12771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
12772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res;
12773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr obj;
12774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodeSetPtr oldset;
12775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr oldnode;
12776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr oldDoc;
12777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
12778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
12781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Optimization for ()[last()] selection i.e. the last elem
12783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((op->ch1 != -1) && (op->ch2 != -1) &&
12785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(comp->steps[op->ch1].op == XPATH_OP_SORT) &&
12786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(comp->steps[op->ch2].op == XPATH_OP_SORT)) {
12787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int f = comp->steps[op->ch2].ch1;
12788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((f != -1) &&
12790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].op == XPATH_OP_FUNCTION) &&
12791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value5 == NULL) &&
12792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value == 0) &&
12793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value4 != NULL) &&
12794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrEqual
12795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->steps[f].value4, BAD_CAST "last"))) {
12796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr last = NULL;
12797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    total +=
12799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathCompOpEvalLast(ctxt,
12800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &comp->steps[op->ch1],
12801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &last);
12802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The nodeset should be in document order,
12805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Keep only the last value
12806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt->value != NULL) &&
12808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->type == XPATH_NODESET) &&
12809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval != NULL) &&
12810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval->nodeTab != NULL) &&
12811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval->nodeNr > 1)) {
12812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->value->nodesetval->nodeTab[0] =
12813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->value->nodesetval->nodeTab[ctxt->
12814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value->
12815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nodesetval->
12816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nodeNr -
12817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    1];
12818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->value->nodesetval->nodeNr = 1;
12819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*first = *(ctxt->value->nodesetval->nodeTab);
12820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (total);
12822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1)
12826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
12827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
12828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 == -1)
12829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (total);
12830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL)
12831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (total);
12832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
12834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldnode = ctxt->context->node;
12835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Hum are we filtering the result of an XPointer expression
12837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value->type == XPATH_LOCATIONSET) {
12839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp = NULL;
12840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlLocationSetPtr newlocset = NULL;
12841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlLocationSetPtr oldlocset;
12842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Extract the old locset, and then evaluate the result of the
12845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* expression for all the element in the locset. use it to grow
12846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* up a new locset.
12847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_TYPE0(XPATH_LOCATIONSET);
12849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	obj = valuePop(ctxt);
12850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldlocset = obj->user;
12851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
12852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((oldlocset == NULL) || (oldlocset->locNr == 0)) {
12854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = 0;
12855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = 0;
12856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
12857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
12859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL) {
12860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, res);
12861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, obj);
12863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (total);
12865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newlocset = xmlXPtrLocationSetCreate(NULL);
12867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < oldlocset->locNr; i++) {
12869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Run the evaluation with a node list made of a
12871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * single item in the nodelocset.
12872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = oldlocset->locTab[i]->user;
12874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = oldlocset->locNr;
12875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = i + 1;
12876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL) {
12877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlXPathCacheNewNodeSet(ctxt->context,
12878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
12879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(tmp->nodesetval,
12881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
12882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, tmp);
12884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
12885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
12886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK) {
12887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(obj);
12888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
12889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The result of the evaluation need to be tested to
12892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * decided whether the filter succeeded or not
12893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
12895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
12896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPtrLocationSetAdd(newlocset,
12897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCacheObjectCopy(ctxt->context,
12898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			oldlocset->locTab[i]));
12899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Cleanup
12902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL) {
12904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, res);
12905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == tmp) {
12907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
12908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(tmp->nodesetval, 1);
12909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* REVISIT TODO: Don't create a temporary nodeset
12911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* for everly iteration.
12912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* OLD: xmlXPathFreeObject(res); */
12914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
12915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = NULL;
12916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = NULL;
12917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Only put the first node in the result, then leave.
12919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (newlocset->locNr > 0) {
12921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*first = (xmlNodePtr) oldlocset->locTab[i]->user;
12922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
12923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
12926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, tmp);
12927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The result is used as the new evaluation locset.
12930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, obj);
12932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
12933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = -1;
12934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = -1;
12935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
12936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = oldnode;
12937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (total);
12938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
12940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract the old set, and then evaluate the result of the
12943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * expression for all the element in the set. use it to grow
12944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * up a new set.
12945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_TYPE0(XPATH_NODESET);
12947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    obj = valuePop(ctxt);
12948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldset = obj->nodesetval;
12949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldnode = ctxt->context->node;
12951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldDoc = ctxt->context->doc;
12952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = NULL;
12953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((oldset == NULL) || (oldset->nodeNr == 0)) {
12955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = 0;
12956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = 0;
12957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* QUESTION TODO: Why was this code commented out?
12958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
12959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total +=
12960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathCompOpEval(ctxt,
12961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&comp->steps[op->ch2]);
12962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
12963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
12964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL)
12965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(res);
12966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, obj);
12968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = oldnode;
12969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	CHECK_ERROR0;
12970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodeSetPtr newset;
12972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp = NULL;
12973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Initialize the new set.
12975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Also set the xpath document in case things like
12976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* key() evaluation are attempted on the predicate
12977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newset = xmlXPathNodeSetCreate(NULL);
12979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < oldset->nodeNr; i++) {
12981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Run the evaluation with a node list made of
12983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * a single item in the nodeset.
12984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = oldset->nodeTab[i];
12986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) &&
12987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(oldset->nodeTab[i]->doc != NULL))
12988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->doc = oldset->nodeTab[i]->doc;
12989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL) {
12990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlXPathCacheNewNodeSet(ctxt->context,
12991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
12992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAddUnique(tmp->nodesetval,
12994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->node);
12995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, tmp);
12997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = oldset->nodeNr;
12998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = i + 1;
12999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch2 != -1)
13000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK) {
13002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeNodeSet(newset);
13003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(obj);
13004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The result of the evaluation needs to be tested to
13008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * decide whether the filter succeeded or not
13009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = valuePop(ctxt);
13011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]);
13013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Cleanup
13016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != NULL) {
13018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, res);
13019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->value == tmp) {
13021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePop(ctxt);
13022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't free the temporary nodeset
13024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* in order to avoid massive recreation inside this
13025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* loop.
13026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathNodeSetClear(tmp->nodesetval, 1);
13028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
13029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = NULL;
13030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = NULL;
13031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Only put the first node in the result, then leave.
13033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (newset->nodeNr > 0) {
13035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*first = *(newset->nodeTab);
13036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
13040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, tmp);
13041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The result is used as the new evaluation set.
13044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, obj);
13046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->node = NULL;
13047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->contextSize = -1;
13048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->proximityPosition = -1;
13049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* may want to move this past the '}' later */
13050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->context->doc = oldDoc;
13051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset));
13052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->context->node = oldnode;
13054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(total);
13055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_FILTER_FIRST */
13057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEval:
13060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
13061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op:  an XPath compiled operation
13062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation
13064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed
13065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op)
13068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int total = 0;
13070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int equal, ret;
13071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
13072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr arg1, arg2;
13073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr bak;
13074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr bakd;
13075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pp;
13076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cs;
13077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR0;
13079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
13080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
13081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
13082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
13083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_AND:
13084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value == NULL) || (ctxt->value->boolval == 0))
13092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
13094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error) {
13100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(arg2);
13101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
13105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->boolval &= arg2->boolval;
13106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
13107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
13108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_OR:
13110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value == NULL) || (ctxt->value->boolval == 1))
13118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
13120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error) {
13126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathFreeObject(arg2);
13127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathBooleanFunction(ctxt, 1);
13130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
13131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1->boolval |= arg2->boolval;
13132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
13133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
13134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_EQUAL:
13136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->value)
13149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        	equal = xmlXPathEqualValues(ctxt);
13150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
13151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		equal = xmlXPathNotEqualValues(ctxt);
13152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal));
13153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_CMP:
13155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlXPathCompareValues(ctxt, op->value, op->value2);
13168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret));
13169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PLUS:
13171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1) {
13178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->doc = bakd;
13179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node = bak;
13180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->proximityPosition = pp;
13181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->contextSize = cs;
13182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->value == 0)
13186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathSubValues(ctxt);
13187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 1)
13188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathAddValues(ctxt);
13189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 2)
13190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathValueFlipSign(ctxt);
13191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 3) {
13192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                CAST_TO_NUMBER;
13193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                CHECK_TYPE0(XPATH_NUMBER);
13194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_MULT:
13197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->value == 0)
13210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathMultValues(ctxt);
13211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 1)
13212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathDivValues(ctxt);
13213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (op->value == 2)
13214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathModValues(ctxt);
13215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_UNION:
13217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
13230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg2 = valuePop(ctxt);
13231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            CHECK_TYPE0(XPATH_NODESET);
13233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            arg1 = valuePop(ctxt);
13234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((arg1->nodesetval == NULL) ||
13236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((arg2->nodesetval != NULL) &&
13237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (arg2->nodesetval->nodeNr != 0)))
13238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
13239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
13240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project							arg2->nodesetval);
13241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt, arg1);
13244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt->context, arg2);
13245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ROOT:
13247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathRoot(ctxt);
13248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_NODE:
13250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
13254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
13257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->context->node));
13258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RESET:
13260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1)
13264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->context->node = NULL;
13267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_COLLECT:{
13269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 == -1)
13270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
13274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0);
13276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VALUE:
13279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            valuePush(ctxt,
13280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlXPathCacheObjectCopy(ctxt->context,
13281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlXPathObjectPtr) op->value4));
13282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_VARIABLE:{
13284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathObjectPtr val;
13285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->value5 == NULL) {
13290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val = xmlXPathVariableLookup(ctxt->context, op->value4);
13291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (val == NULL) {
13292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->error = XPATH_UNDEF_VARIABLE_ERROR;
13293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0);
13294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, val);
13296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
13297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const xmlChar *URI;
13298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    URI = xmlXPathNsLookup(ctxt->context, op->value5);
13300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (URI == NULL) {
13301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGenericError(xmlGenericErrorContext,
13302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n",
13303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        op->value4, op->value5);
13304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val = xmlXPathVariableLookupNS(ctxt->context,
13307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                       op->value4, URI);
13308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (val == NULL) {
13309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->error = XPATH_UNDEF_VARIABLE_ERROR;
13310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0);
13311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, val);
13313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_FUNCTION:{
13317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathFunction func;
13318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *oldFunc, *oldFuncURI;
13319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
13320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->valueNr < op->value) {
13325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
13326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "xmlXPathCompOpEval: parameter error\n");
13327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->error = XPATH_INVALID_OPERAND;
13328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (total);
13329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < op->value; i++)
13331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) {
13332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlGenericError(xmlGenericErrorContext,
13333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"xmlXPathCompOpEval: parameter error\n");
13334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->error = XPATH_INVALID_OPERAND;
13335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (total);
13336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->cache != NULL)
13338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    XML_CAST_FPTR(func) = op->cache;
13339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else {
13340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const xmlChar *URI = NULL;
13341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (op->value5 == NULL)
13343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        func =
13344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathFunctionLookup(ctxt->context,
13345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   op->value4);
13346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else {
13347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        URI = xmlXPathNsLookup(ctxt->context, op->value5);
13348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (URI == NULL) {
13349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlGenericError(xmlGenericErrorContext,
13350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n",
13351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            op->value4, op->value5);
13352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            return (total);
13353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        func = xmlXPathFunctionLookupNS(ctxt->context,
13355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        op->value4, URI);
13356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (func == NULL) {
13358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGenericError(xmlGenericErrorContext,
13359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        "xmlXPathCompOpEval: function %s not found\n",
13360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        op->value4);
13361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR);
13362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    op->cache = XML_CAST_FPTR(func);
13364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    op->cacheURI = (void *) URI;
13365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldFunc = ctxt->context->function;
13367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldFuncURI = ctxt->context->functionURI;
13368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->function = op->value4;
13369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->functionURI = op->cacheURI;
13370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                func(ctxt, op->value);
13371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->function = oldFunc;
13372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->functionURI = oldFuncURI;
13373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_ARG:
13376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bakd = ctxt->context->doc;
13377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bak = ctxt->context->node;
13378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pp = ctxt->context->proximityPosition;
13379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cs = ctxt->context->contextSize;
13380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->contextSize = cs;
13383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->proximityPosition = pp;
13384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->node = bak;
13385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->context->doc = bakd;
13386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch2 != -1) {
13388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
13389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->context->doc = bakd;
13390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ctxt->context->node = bak;
13391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        CHECK_ERROR0;
13392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_PREDICATE:
13395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_FILTER:{
13396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr res;
13397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr obj, tmp;
13398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodeSetPtr newset = NULL;
13399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodeSetPtr oldset;
13400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr oldnode;
13401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDocPtr oldDoc;
13402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int i;
13403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Optimization for ()[1] selection i.e. the first elem
13406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((op->ch1 != -1) && (op->ch2 != -1) &&
13408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST
13409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
13410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * FILTER TODO: Can we assume that the inner processing
13411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  will result in an ordered list if we have an
13412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  XPATH_OP_FILTER?
13413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  What about an additional field or flag on
13414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  xmlXPathObject like @sorted ? This way we wouln'd need
13415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  to assume anything, so it would be more robust and
13416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  easier to optimize.
13417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
13418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */
13419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */
13420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
13421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (comp->steps[op->ch1].op == XPATH_OP_SORT) &&
13422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */
13424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlXPathObjectPtr val;
13425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    val = comp->steps[op->ch2].value4;
13427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((val != NULL) && (val->type == XPATH_NUMBER) &&
13428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (val->floatval == 1.0)) {
13429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr first = NULL;
13430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total +=
13432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathCompOpEvalFirst(ctxt,
13433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    &comp->steps[op->ch1],
13434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    &first);
13435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			CHECK_ERROR0;
13436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The nodeset should be in document order,
13438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Keep only the first value
13439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((ctxt->value != NULL) &&
13441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->type == XPATH_NODESET) &&
13442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval != NULL) &&
13443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval->nodeNr > 1))
13444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->value->nodesetval->nodeNr = 1;
13445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Optimization for ()[last()] selection i.e. the last elem
13450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((op->ch1 != -1) && (op->ch2 != -1) &&
13452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (comp->steps[op->ch1].op == XPATH_OP_SORT) &&
13453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (comp->steps[op->ch2].op == XPATH_OP_SORT)) {
13454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int f = comp->steps[op->ch2].ch1;
13455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((f != -1) &&
13457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].op == XPATH_OP_FUNCTION) &&
13458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].value5 == NULL) &&
13459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].value == 0) &&
13460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (comp->steps[f].value4 != NULL) &&
13461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlStrEqual
13462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (comp->steps[f].value4, BAD_CAST "last"))) {
13463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr last = NULL;
13464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total +=
13466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathCompOpEvalLast(ctxt,
13467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch1],
13468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &last);
13469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			CHECK_ERROR0;
13470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The nodeset should be in document order,
13472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Keep only the last value
13473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((ctxt->value != NULL) &&
13475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->type == XPATH_NODESET) &&
13476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval != NULL) &&
13477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval->nodeTab != NULL) &&
13478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ctxt->value->nodesetval->nodeNr > 1)) {
13479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->value->nodesetval->nodeTab[0] =
13480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ctxt->value->nodesetval->nodeTab[ctxt->
13481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 value->
13482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 nodesetval->
13483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 nodeNr -
13484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 1];
13485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->value->nodesetval->nodeNr = 1;
13486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Process inner predicates first.
13492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Example "index[parent::book][1]":
13493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* ...
13494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   PREDICATE   <-- we are here "[1]"
13495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*     PREDICATE <-- process "[parent::book]" first
13496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*       SORT
13497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*         COLLECT  'parent' 'name' 'node' book
13498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*           NODE
13499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*     ELEM Object is a number : 1
13500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		CHECK_ERROR0;
13505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch2 == -1)
13506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->value == NULL)
13508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldnode = ctxt->context->node;
13511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
13513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Hum are we filtering the result of an XPointer expression
13515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->value->type == XPATH_LOCATIONSET) {
13517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlLocationSetPtr newlocset = NULL;
13518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlLocationSetPtr oldlocset;
13519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Extract the old locset, and then evaluate the result of the
13522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * expression for all the element in the locset. use it to grow
13523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * up a new locset.
13524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_TYPE0(XPATH_LOCATIONSET);
13526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    obj = valuePop(ctxt);
13527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldlocset = obj->user;
13528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((oldlocset == NULL) || (oldlocset->locNr == 0)) {
13531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = 0;
13532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = 0;
13533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, obj);
13542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        CHECK_ERROR0;
13543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newlocset = xmlXPtrLocationSetCreate(NULL);
13546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < oldlocset->locNr; i++) {
13548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Run the evaluation with a node list made of a
13550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * single item in the nodelocset.
13551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = oldlocset->locTab[i]->user;
13553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = oldlocset->locNr;
13554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = i + 1;
13555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->context->node);
13557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, tmp);
13558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->error != XPATH_EXPRESSION_OK) {
13564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
13565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(0);
13566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The result of the evaluation need to be tested to
13570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * decided whether the filter succeeded or not
13571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPtrLocationSetAdd(newlocset,
13575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlXPathObjectCopy
13576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  (oldlocset->locTab[i]));
13577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Cleanup
13581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->value == tmp) {
13586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            res = valuePop(ctxt);
13587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = NULL;
13591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * The result is used as the new evaluation locset.
13595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathReleaseObject(ctxt->context, obj);
13597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->contextSize = -1;
13599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->proximityPosition = -1;
13600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
13601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = oldnode;
13602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
13605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Extract the old set, and then evaluate the result of the
13608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * expression for all the element in the set. use it to grow
13609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * up a new set.
13610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                CHECK_TYPE0(XPATH_NODESET);
13612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                obj = valuePop(ctxt);
13613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldset = obj->nodesetval;
13614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldnode = ctxt->context->node;
13616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		oldDoc = ctxt->context->doc;
13617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->node = NULL;
13618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((oldset == NULL) || (oldset->nodeNr == 0)) {
13620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->contextSize = 0;
13621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->proximityPosition = 0;
13622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
13623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (op->ch2 != -1)
13624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total +=
13625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathCompOpEval(ctxt,
13626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               &comp->steps[op->ch2]);
13627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    CHECK_ERROR0;
13628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = valuePop(ctxt);
13629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != NULL)
13630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathFreeObject(res);
13631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
13632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    valuePush(ctxt, obj);
13633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = oldnode;
13634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_ERROR0;
13635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
13636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = NULL;
13637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Initialize the new set.
13639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * Also set the xpath document in case things like
13640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * key() evaluation are attempted on the predicate
13641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newset = xmlXPathNodeSetCreate(NULL);
13643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
13644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC XPath 1.0:
13645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  "For each node in the node-set to be filtered, the
13646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  PredicateExpr is evaluated with that node as the
13647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  context node, with the number of nodes in the
13648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  node-set as the context size, and with the proximity
13649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  position of the node in the node-set with respect to
13650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  the axis as the context position;"
13651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * @oldset is the node-set" to be filtered.
13652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
13653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC XPath 1.0:
13654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  "only predicates change the context position and
13655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *  context size (see [2.4 Predicates])."
13656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Example:
13657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   node-set  context pos
13658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nA         1
13659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nB         2
13660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nC         3
13661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   After applying predicate [position() > 1] :
13662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   node-set  context pos
13663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nB         1
13664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *    nC         2
13665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
13666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * removed the first node in the node-set, then
13667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the context position of the
13668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
13669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < oldset->nodeNr; i++) {
13670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Run the evaluation with a node list made of
13672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * a single item in the nodeset.
13673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = oldset->nodeTab[i];
13675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) &&
13676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (oldset->nodeTab[i]->doc != NULL))
13677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		            ctxt->context->doc = oldset->nodeTab[i]->doc;
13678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (tmp == NULL) {
13679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxt->context->node);
13681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
13682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathNodeSetAddUnique(tmp->nodesetval,
13683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxt->context->node);
13684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, tmp);
13686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = oldset->nodeNr;
13687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = i + 1;
13688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
13689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Evaluate the predicate against the context node.
13690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Can/should we optimize position() predicates
13691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* here (e.g. "[1]")?
13692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
13693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->error != XPATH_EXPRESSION_OK) {
13698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeNodeSet(newset);
13699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
13700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(0);
13701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * The result of the evaluation needs to be tested to
13705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * decide whether the filter succeeded or not
13706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
13708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* OPTIMIZE TODO: Can we use
13709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* xmlXPathNodeSetAdd*Unique()* instead?
13710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
13711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlXPathEvaluatePredicateResult(ctxt, res)) {
13713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]);
13714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Cleanup
13718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->value == tmp) {
13723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            valuePop(ctxt);
13724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathNodeSetClear(tmp->nodesetval, 1);
13725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
13726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * Don't free the temporary nodeset
13727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * in order to avoid massive recreation inside this
13728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * loop.
13729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
13730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else
13731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp = NULL;
13732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = NULL;
13733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (tmp != NULL)
13735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathReleaseObject(ctxt->context, tmp);
13736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * The result is used as the new evaluation set.
13738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathReleaseObject(ctxt->context, obj);
13740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->contextSize = -1;
13742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->proximityPosition = -1;
13743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* may want to move this past the '}' later */
13744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->context->doc = oldDoc;
13745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valuePush(ctxt,
13746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlXPathCacheWrapNodeSet(ctxt->context, newset));
13747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->node = oldnode;
13749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_SORT:
13752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1)
13753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    CHECK_ERROR0;
13755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->value != NULL) &&
13756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ctxt->value->type == XPATH_NODESET) &&
13757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ctxt->value->nodesetval != NULL) &&
13758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ctxt->value->nodesetval->nodeNr > 1))
13759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
13760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathNodeSetSort(ctxt->value->nodesetval);
13761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (total);
13763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
13764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_RANGETO:{
13765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr range;
13766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr res, obj;
13767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlXPathObjectPtr tmp;
13768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlLocationSetPtr newlocset = NULL;
13769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlLocationSetPtr oldlocset;
13770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodeSetPtr oldset;
13771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int i, j;
13772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch1 != -1)
13774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total +=
13775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
13776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (op->ch2 == -1)
13777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (total);
13778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->value->type == XPATH_LOCATIONSET) {
13780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
13781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Extract the old locset, and then evaluate the result of the
13782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * expression for all the element in the locset. use it to grow
13783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * up a new locset.
13784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
13785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_TYPE0(XPATH_LOCATIONSET);
13786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    obj = valuePop(ctxt);
13787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldlocset = obj->user;
13788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((oldlocset == NULL) || (oldlocset->locNr == 0)) {
13790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ctxt->context->node = NULL;
13791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = 0;
13792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = 0;
13793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]);
13794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, obj);
13799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        CHECK_ERROR0;
13800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return (total);
13801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newlocset = xmlXPtrLocationSetCreate(NULL);
13803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < oldlocset->locNr; i++) {
13805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Run the evaluation with a node list made of a
13807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * single item in the nodelocset.
13808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = oldlocset->locTab[i]->user;
13810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->contextSize = oldlocset->locNr;
13811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->proximityPosition = i + 1;
13812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->context->node);
13814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        valuePush(ctxt, tmp);
13815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (op->ch2 != -1)
13817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            total +=
13818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathCompOpEval(ctxt,
13819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->error != XPATH_EXPRESSION_OK) {
13821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathFreeObject(obj);
13822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(0);
13823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = valuePop(ctxt);
13826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res->type == XPATH_LOCATIONSET) {
13827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlLocationSetPtr rloc =
13828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        (xmlLocationSetPtr)res->user;
13829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (j=0; j<rloc->locNr; j++) {
13830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        range = xmlXPtrNewRange(
13831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  oldlocset->locTab[i]->user,
13832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  oldlocset->locTab[i]->index,
13833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  rloc->locTab[j]->user2,
13834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  rloc->locTab[j]->index2);
13835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (range != NULL) {
13836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlXPtrLocationSetAdd(newlocset, range);
13837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
13838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
13839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
13840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    range = xmlXPtrNewRangeNodeObject(
13841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(xmlNodePtr)oldlocset->locTab[i]->user, res);
13842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (range != NULL) {
13843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPtrLocationSetAdd(newlocset,range);
13844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
13845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
13848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Cleanup
13849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
13850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res != NULL) {
13851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->value == tmp) {
13854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            res = valuePop(ctxt);
13855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathReleaseObject(ctxt->context, res);
13856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->context->node = NULL;
13859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {	/* Not a location set */
13861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    CHECK_TYPE0(XPATH_NODESET);
13862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    obj = valuePop(ctxt);
13863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldset = obj->nodesetval;
13864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->context->node = NULL;
13865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newlocset = xmlXPtrLocationSetCreate(NULL);
13867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (oldset != NULL) {
13869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        for (i = 0; i < oldset->nodeNr; i++) {
13870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            /*
13871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             * Run the evaluation with a node list made of a single item
13872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             * in the nodeset.
13873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             */
13874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->context->node = oldset->nodeTab[i];
13875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
13876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * OPTIMIZE TODO: Avoid recreation for every iteration.
13877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
13878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxt->context->node);
13880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            valuePush(ctxt, tmp);
13881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (op->ch2 != -1)
13883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                total +=
13884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlXPathCompOpEval(ctxt,
13885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   &comp->steps[op->ch2]);
13886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ctxt->error != XPATH_EXPRESSION_OK) {
13887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlXPathFreeObject(obj);
13888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				return(0);
13889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
13890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            res = valuePop(ctxt);
13892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            range =
13893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPtrNewRangeNodeObject(oldset->nodeTab[i],
13894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      res);
13895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (range != NULL) {
13896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPtrLocationSetAdd(newlocset, range);
13897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
13898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            /*
13900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             * Cleanup
13901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             */
13902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (res != NULL) {
13903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlXPathReleaseObject(ctxt->context, res);
13904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
13905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ctxt->value == tmp) {
13906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                res = valuePop(ctxt);
13907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlXPathReleaseObject(ctxt->context, res);
13908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
13909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->context->node = NULL;
13911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
13912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
13913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
13916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * The result is used as the new evaluation set.
13917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
13918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, obj);
13919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->node = NULL;
13920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->contextSize = -1;
13921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->context->proximityPosition = -1;
13922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
13923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (total);
13924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */
13926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
13928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "XPath: unknown precompiled operation %d\n", op->op);
13929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (total);
13930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalToBoolean:
13934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context
13935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if the expression evaluates to true.
13937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if false and -1 on API or internal errors.
13939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
13942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlXPathStepOpPtr op,
13943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int isPredicate)
13944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr resObj = NULL;
13946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstart:
13948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* comp = ctxt->comp; */
13949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (op->op) {
13950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_OP_END:
13951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
13952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_VALUE:
13953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resObj = (xmlXPathObjectPtr) op->value4;
13954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (isPredicate)
13955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlXPathEvaluatePredicateResult(ctxt, resObj));
13956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlXPathCastToBoolean(resObj));
13957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_SORT:
13958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We don't need sorting for boolean results. Skip this one.
13960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (op->ch1 != -1) {
13962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		op = &ctxt->comp->steps[op->ch1];
13963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto start;
13964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
13966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_OP_COLLECT:
13967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (op->ch1 == -1)
13968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]);
13971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK)
13972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1);
13975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK)
13976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resObj = valuePop(ctxt);
13979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resObj == NULL)
13980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
13982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
13983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fallback to call xmlXPathCompOpEval().
13985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathCompOpEval(ctxt, op);
13987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->error != XPATH_EXPRESSION_OK)
13988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resObj = valuePop(ctxt);
13991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resObj == NULL)
13992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
13994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resObj) {
13997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int res;
13998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (resObj->type == XPATH_BOOLEAN) {
14000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = resObj->boolval;
14001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (isPredicate) {
14002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * For predicates a result of type "number" is handled
14004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * differently:
14005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC XPath 1.0:
14006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "If the result is a number, the result will be converted
14007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  to true if the number is equal to the context position
14008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  and will be converted to false otherwise;"
14009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathEvaluatePredicateResult(ctxt, resObj);
14011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathCastToBoolean(resObj);
14013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathReleaseObject(ctxt->context, resObj);
14015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(res);
14016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunStreamEval:
14024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
14025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled Streamable XPath expression in the given context.
14027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp,
14030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlXPathObjectPtr *resultSeq, int toBool)
14031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int max_depth, min_depth;
14033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int from_root;
14034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, depth;
14035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int eval_all_nodes;
14036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur = NULL, limit = NULL;
14037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStreamCtxtPtr patstream = NULL;
14038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb_nodes = 0;
14040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (comp == NULL))
14042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max_depth = xmlPatternMaxDepth(comp);
14044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (max_depth == -1)
14045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (max_depth == -2)
14047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        max_depth = 10000;
14048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min_depth = xmlPatternMinDepth(comp);
14049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min_depth == -1)
14050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    from_root = xmlPatternFromRoot(comp);
14052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from_root < 0)
14053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
14054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
14055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("stream eval: depth %d from root %d\n", max_depth, from_root);
14056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! toBool) {
14059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (resultSeq == NULL)
14060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL);
14062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*resultSeq == NULL)
14063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * handle the special cases of "/" amd "." being matched
14068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
14069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min_depth == 0) {
14070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (from_root) {
14071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Select "/" */
14072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toBool)
14073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
14074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
14075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlNodePtr) ctxt->doc);
14076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Select "self::node()" */
14078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toBool)
14079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
14080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node);
14081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (max_depth == 0) {
14084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from_root) {
14088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = (xmlNodePtr)ctxt->doc;
14089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->node != NULL) {
14090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (ctxt->node->type) {
14091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
14092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_NODE:
14093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_FRAG_NODE:
14094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_HTML_DOCUMENT_NODE:
14095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED
14096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCB_DOCUMENT_NODE:
14097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        cur = ctxt->node;
14099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_NODE:
14101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
14102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
14103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_REF_NODE:
14104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_NODE:
14105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_PI_NODE:
14106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_COMMENT_NODE:
14107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NOTATION_NODE:
14108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DTD_NODE:
14109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_DOCUMENT_TYPE_NODE:
14110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_DECL:
14111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ATTRIBUTE_DECL:
14112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ENTITY_DECL:
14113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_NAMESPACE_DECL:
14114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_XINCLUDE_START:
14115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_XINCLUDE_END:
14116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	limit = cur;
14119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
14121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
14122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    patstream = xmlPatternGetStreamCtxt(comp);
14125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (patstream == NULL) {
14126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* QUESTION TODO: Is this an error?
14128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    eval_all_nodes = xmlStreamWantsAnyNode(patstream);
14133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from_root) {
14135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlStreamPush(patstream, NULL, NULL);
14136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
14137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ret == 1) {
14138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (toBool)
14139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto return_1;
14140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur);
14141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    depth = 0;
14144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    goto scan_children;
14145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_node:
14146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nb_nodes++;
14148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur->type) {
14150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_ELEMENT_NODE:
14151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_TEXT_NODE:
14152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_CDATA_SECTION_NODE:
14153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_COMMENT_NODE:
14154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_PI_NODE:
14155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->type == XML_ELEMENT_NODE) {
14156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStreamPush(patstream, cur->name,
14157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(cur->ns ? cur->ns->href : NULL));
14158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (eval_all_nodes)
14159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type);
14160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
14161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
14162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
14164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* NOP. */
14165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (ret == 1) {
14166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (toBool)
14167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto return_1;
14168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur);
14169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((cur->children == NULL) || (depth >= max_depth)) {
14171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlStreamPop(patstream);
14172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (cur->next != NULL) {
14173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur = cur->next;
14174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((cur->type != XML_ENTITY_DECL) &&
14175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (cur->type != XML_DTD_NODE))
14176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto next_node;
14177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
14180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectscan_children:
14184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->children != NULL) && (depth < max_depth)) {
14185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Do not descend on entities declarations
14187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
14188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->children->type != XML_ENTITY_DECL) {
14189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->children;
14190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		depth++;
14191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Skip DTDs
14193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
14194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->type != XML_DTD_NODE)
14195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
14196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == limit)
14200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
14201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur->next != NULL) {
14203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
14204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->type != XML_ENTITY_DECL) &&
14205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->type != XML_DTD_NODE))
14206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_node;
14207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
14210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->parent;
14211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    depth--;
14212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur == NULL) || (cur == limit))
14213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        goto done;
14214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->type == XML_ELEMENT_NODE) {
14215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlStreamPop(patstream);
14216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((eval_all_nodes) &&
14217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->type == XML_TEXT_NODE) ||
14218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->type == XML_CDATA_SECTION_NODE) ||
14219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->type == XML_COMMENT_NODE) ||
14220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->type == XML_PI_NODE)))
14221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlStreamPop(patstream);
14223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->next != NULL) {
14225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
14226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
14227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
14229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((cur != NULL) && (depth >= 0));
14231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
14233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
14235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("stream eval: checked %d nodes selected %d\n",
14236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           nb_nodes, retObj->nodesetval->nodeNr);
14237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (patstream)
14240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeStreamCtxt(patstream);
14241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectreturn_1:
14244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (patstream)
14245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeStreamCtxt(patstream);
14246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
14247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */
14249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunEval:
14252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath parser context with the compiled expression
14253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool:  evaluate to a boolean result
14254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context.
14256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool)
14259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->comp == NULL))
14263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->valueTab == NULL) {
14266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Allocate the value stack */
14267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueTab = (xmlXPathObjectPtr *)
14268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlMalloc(10 * sizeof(xmlXPathObjectPtr));
14269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->valueTab == NULL) {
14270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathPErrMemory(ctxt, "creating evaluation context\n");
14271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ctxt);
14272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueNr = 0;
14274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->valueMax = 10;
14275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->value = NULL;
14276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->comp->stream) {
14279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int res;
14280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (toBool) {
14282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluation to boolean result.
14284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathRunStreamEval(ctxt->context,
14286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->comp->stream, NULL, 1);
14287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1)
14288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(res);
14289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathObjectPtr resObj = NULL;
14291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluation to a sequence.
14294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlXPathRunStreamEval(ctxt->context,
14296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->comp->stream, &resObj, 0);
14297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != -1) && (resObj != NULL)) {
14299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valuePush(ctxt, resObj);
14300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resObj != NULL)
14303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt->context, resObj);
14304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* QUESTION TODO: This falls back to normal XPath evaluation
14307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* if res == -1. Is this intended?
14308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = ctxt->comp;
14312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->last < 0) {
14313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "xmlXPathRunEval: last is less than zero\n");
14315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (toBool)
14318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlXPathCompOpEvalToBoolean(ctxt,
14319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &comp->steps[comp->last], 0));
14320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
14321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]);
14322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
14327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
14328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Public interfaces				*
14329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
14330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
14331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalPredicate:
14334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res:  the Predicate Expression evaluation result
14336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node.
14338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting
14339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will
14340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the
14341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position
14342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result
14343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call
14344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the boolean function.
14345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise
14347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
14349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) {
14350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (res == NULL)) return(0);
14351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (res->type) {
14352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
14353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->boolval);
14354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
14355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->floatval == ctxt->proximityPosition);
14356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
14357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
14358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res->nodesetval == NULL)
14359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->nodesetval->nodeNr != 0);
14361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
14362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return((res->stringval != NULL) &&
14363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (xmlStrlen(res->stringval) != 0));
14364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
14365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
14366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvaluatePredicateResult:
14372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
14373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res:  the Predicate Expression evaluation result
14374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node.
14376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting
14377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will
14378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the
14379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position
14380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result
14381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call
14382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the boolean function.
14383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise
14385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
14387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt,
14388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlXPathObjectPtr res) {
14389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (res == NULL)) return(0);
14390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (res->type) {
14391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_BOOLEAN:
14392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->boolval);
14393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NUMBER:
14394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200))
14395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return((res->floatval == ctxt->context->proximityPosition) &&
14396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/
14397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
14398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->floatval == ctxt->context->proximityPosition);
14399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_NODESET:
14401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_XSLT_TREE:
14402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res->nodesetval == NULL)
14403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(res->nodesetval->nodeNr != 0);
14405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XPATH_STRING:
14406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return((res->stringval != NULL) && (res->stringval[0] != 0));
14407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED
14408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XPATH_LOCATIONSET:{
14409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlLocationSetPtr ptr = res->user;
14410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ptr == NULL)
14411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(0);
14412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ptr->locNr != 0);
14413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
14416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    STRANGE
14417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTryStreamCompile:
14424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context
14425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the XPath expression as a streamable subset.
14428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL if failed to compile.
14430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr
14432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) {
14433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Optimization: use streaming patterns when the XPath expression can
14435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * be compiled to a stream lookup
14436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
14437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPatternPtr stream;
14438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict = NULL;
14440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar **namespaces = NULL;
14441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNsPtr ns;
14442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
14443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) &&
14445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (!xmlStrchr(str, '@'))) {
14446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *tmp;
14447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * We don't try to handle expressions using the verbose axis
14450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * specifiers ("::"), just the simplied form at this point.
14451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Additionally, if there is no list of namespaces available and
14452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  there's a ":" in the expression, indicating a prefixed QName,
14453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  then we won't try to compile either. xmlPatterncompile() needs
14454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  to have a list of namespaces at compilation time in order to
14455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *  compile prefixed name tests.
14456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
14457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlStrchr(str, ':');
14458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp != NULL) &&
14459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':')))
14460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
14461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt != NULL) {
14463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dict = ctxt->dict;
14464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->nsNr > 0) {
14465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*));
14466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (namespaces == NULL) {
14467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlXPathErrMemory(ctxt, "allocating namespaces array\n");
14468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
14469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0, j = 0; (j < ctxt->nsNr); j++) {
14471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = ctxt->namespaces[j];
14472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    namespaces[i++] = ns->href;
14473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    namespaces[i++] = ns->prefix;
14474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		namespaces[i++] = NULL;
14476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		namespaces[i++] = NULL;
14477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH,
14481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&namespaces[0]);
14482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (namespaces != NULL) {
14483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **)namespaces);
14484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 	}
14485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) {
14486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp = xmlXPathNewCompExpr();
14487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (comp == NULL) {
14488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathErrMemory(ctxt, "allocating streamable expression\n");
14489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
14490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->stream = stream;
14492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    comp->dict = dict;
14493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (comp->dict)
14494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDictReference(comp->dict);
14495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(comp);
14496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreePattern(stream);
14498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
14500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */
14502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCanRewriteDosExpression(xmlChar *expr)
14505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (expr == NULL)
14507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((*expr == '/') && (*(++expr) == '/'))
14510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
14511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*expr++);
14512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
14515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRewriteDOSExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op)
14516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Try to rewrite "descendant-or-self::node()/foo" to an optimized
14519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * internal representation.
14520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch1 != -1) {
14522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((op->op == XPATH_OP_COLLECT /* 11 */) &&
14523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlXPathAxisVal) op->value == AXIS_CHILD /* 4 */) &&
14524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlXPathTestVal) op->value2 == NODE_TEST_NAME /* 5 */) &&
14525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlXPathTypeVal) op->value3 == NODE_TYPE_NODE /* 0 */))
14526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is a "child::foo"
14529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathStepOpPtr prevop = &comp->steps[op->ch1];
14531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((prevop->op == XPATH_OP_COLLECT /* 11 */) &&
14533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(prevop->ch1 != -1) &&
14534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlXPathAxisVal) prevop->value ==
14535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AXIS_DESCENDANT_OR_SELF) &&
14536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(prevop->ch2 == -1) &&
14537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) &&
14538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE) &&
14539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(comp->steps[prevop->ch1].op == XPATH_OP_ROOT))
14540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This is a "/descendant-or-self::node()" without predicates.
14543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Eliminate it.
14544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		op->ch1 = prevop->ch1;
14546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		op->rewriteType = XP_REWRITE_DOS_CHILD_ELEM;
14547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (op->ch1 != -1)
14550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch1]);
14551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (op->ch2 != -1)
14553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch2]);
14554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCtxtCompile:
14558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context
14559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression
14562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL.
14564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr
14567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) {
14568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr pctxt;
14569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = xmlXPathTryStreamCompile(ctxt, str);
14573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp != NULL)
14574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(comp);
14575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlXPathNewParserContext(str, ctxt);
14580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
14581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
14582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompileExpr(pctxt, 1);
14583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if( pctxt->error != XPATH_EXPRESSION_OK )
14585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
14586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlXPathFreeParserContext(pctxt);
14587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
14588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*pctxt->cur != 0) {
14591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * aleksey: in some cases this line prints *second* error message
14593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * (see bug #78858) and probably this should be fixed.
14594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * However, we are not sure that all error messages are printed
14595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * out in other places. It's not critical so we leave it as-is for now
14596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
14597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
14598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp = NULL;
14599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp = pctxt->comp;
14601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->comp = NULL;
14602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(pctxt);
14604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp != NULL) {
14606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->expr = xmlStrdup(str);
14607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
14608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->string = xmlStrdup(str);
14609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->nb = 0;
14610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((comp->expr != NULL) &&
14612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->nbStep > 2) &&
14613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (comp->last >= 0) &&
14614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathCanRewriteDosExpression(comp->expr) == 1))
14615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRewriteDOSExpression(comp, &comp->steps[comp->last]);
14617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(comp);
14620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompile:
14624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression
14627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL.
14629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr
14632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompile(const xmlChar *str) {
14633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCtxtCompile(NULL, str));
14634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalInternal:
14638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled XPath expression
14639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @resObj: the resulting XPath object or NULL
14641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool: 1 if only a boolean result is requested
14642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context.
14644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free @resObj.
14645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp,
14651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlXPathContextPtr ctxt,
14652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlXPathObjectPtr *resObj,
14653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int toBool)
14654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr pctxt;
14656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
14657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    static int reentance = 0;
14658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
14660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_CTXT_NEG(ctxt)
14662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp == NULL)
14664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
14668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reentance++;
14669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (reentance > 1)
14670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathDisableOptimizer = 1;
14671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS
14674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp->nb++;
14675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp->string != NULL) && (comp->nb > 100)) {
14676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(stderr, "100 x %s\n", comp->string);
14677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	comp->nb = 0;
14678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlXPathCompParserContext(comp, ctxt);
14681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlXPathRunEval(pctxt, toBool);
14682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resObj) {
14684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->value == NULL) {
14685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
14686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathCompiledEval: evaluation failed\n");
14687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *resObj = NULL;
14688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *resObj = valuePop(pctxt);
14690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Pop all remaining objects from the stack.
14695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->valueNr > 0) {
14697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathObjectPtr tmp;
14698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int stack = 0;
14699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
14701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = valuePop(pctxt);
14702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != NULL) {
14703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stack++;
14704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlXPathReleaseObject(ctxt, tmp);
14705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (tmp != NULL);
14707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((stack != 0) &&
14708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((toBool) || ((resObj) && (*resObj))))
14709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
14711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathCompiledEval: %d objects left on the stack.\n",
14712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stack);
14713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) {
14717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(*resObj);
14718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*resObj = NULL;
14719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->comp = NULL;
14721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(pctxt);
14722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED
14723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    reentance--;
14724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEval:
14731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled XPath expression
14732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  the XPath context
14733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context.
14735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
14740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx)
14741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res = NULL;
14743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompiledEvalInternal(comp, ctx, &res, 0);
14745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalToBoolean:
14750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled XPath expression
14751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the XPath boolean() function on the result of the given
14754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compiled expression.
14755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the expression evaluated to true, 0 if to false and
14757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -1 in API and internal errors.
14758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
14760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
14761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlXPathContextPtr ctxt)
14762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1));
14764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpr:
14768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
14769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate an XPath expression in the given context,
14771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then push the result on the context stack
14772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
14774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) {
14775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathCompExprPtr comp;
14777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return;
14780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base);
14783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp != NULL) {
14784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->comp != NULL)
14785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathFreeCompExpr(ctxt->comp);
14786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->comp = comp;
14787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->cur != NULL)
14788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (*ctxt->cur != 0) ctxt->cur++;
14789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
14790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
14792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathCompileExpr(ctxt, 1);
14793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* In this scenario the expression string will sit in ctxt->base.
14795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt->error == XPATH_EXPRESSION_OK) &&
14797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->comp != NULL) &&
14798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->base != NULL) &&
14799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->comp->nbStep > 2) &&
14800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ctxt->comp->last >= 0) &&
14801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlXPathCanRewriteDosExpression((xmlChar *) ctxt->base) == 1))
14802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathRewriteDOSExpression(ctxt->comp,
14804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&ctxt->comp->steps[ctxt->comp->last]);
14805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ERROR;
14808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRunEval(ctxt, 0);
14809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEval:
14813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  the XPath context
14815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath Location Path in the given context.
14817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
14822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) {
14823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr ctxt;
14824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res, tmp, init = NULL;
14825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stack = 0;
14826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_CTXT(ctx)
14828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt = xmlXPathNewParserContext(str, ctx);
14832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
14833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
14834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathEvalExpr(ctxt);
14835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value == NULL) {
14837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathEval: evaluation failed\n");
14839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
14840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL)
14841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING
14842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            && (ctxt->comp->stream == NULL)
14843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
14844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      ) {
14845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
14846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
14847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(ctxt);
14849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = valuePop(ctxt);
14853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
14854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != init)
14855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stack++;
14856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctx, tmp);
14857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
14858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (tmp != NULL);
14859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((stack != 0) && (res != NULL)) {
14860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathEval: %d object left on the stack\n",
14862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        stack);
14863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->error != XPATH_EXPRESSION_OK) {
14865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPathFreeObject(res);
14866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
14867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(ctxt);
14870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpression:
14875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the XPath expression
14876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
14877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath expression in the given context.
14879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
14881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         the caller has to free the object.
14882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr
14884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) {
14885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathParserContextPtr pctxt;
14886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr res, tmp;
14887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stack = 0;
14888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_CTXT(ctxt)
14890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathInit();
14892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlXPathNewParserContext(str, ctxt);
14894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
14895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
14896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathEvalExpr(pctxt);
14897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) {
14899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
14900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = NULL;
14901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = valuePop(pctxt);
14903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
14905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = valuePop(pctxt);
14906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != NULL) {
14907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlXPathReleaseObject(ctxt, tmp);
14908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    stack++;
14909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (tmp != NULL);
14911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((stack != 0) && (res != NULL)) {
14912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext,
14913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlXPathEvalExpression: %d object left on the stack\n",
14914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        stack);
14915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathFreeParserContext(pctxt);
14917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
14918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
14921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
14922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Extra functions not pertaining to the XPath spec		*
14923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
14924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
14925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEscapeUriFunction:
14927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath Parser context
14928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs:  the number of arguments
14929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the escape-uri() XPath function
14931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    string escape-uri(string $str, bool $escape-reserved)
14932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function applies the URI escaping rules defined in section 2 of [RFC
14934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2396] to the string supplied as $uri-part, which typically represents all
14935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or part of a URI. The effect of the function is to replace any special
14936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string by an escape sequence of the form %xx%yy...,
14937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * where xxyy... is the hexadecimal representation of the octets used to
14938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * represent the character in UTF-8.
14939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The set of characters that are escaped depends on the setting of the
14941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean argument $escape-reserved.
14942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is true, all characters are escaped other than lower
14944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case letters a-z, upper case letters A-Z, digits 0-9, and the characters
14945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!"
14946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only
14947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and
14948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A-F).
14949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is false, the behavior differs in that characters
14951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as reserved characters are not escaped. These
14952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",".
14953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [RFC 2396] does not define whether escaped URIs should use lower case or
14955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upper case for hexadecimal digits. To ensure that escaped URIs can be
14956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compared using string comparison functions, this function must always use
14957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the upper-case letters A-F.
14958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generally, $escape-reserved should be set to true when escaping a string
14960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is to form a single part of a URI, and to false when escaping an
14961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entire URI or URI reference.
14962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In the case of non-ascii characters, the string is encoded according to
14964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * utf-8 and then converted according to RFC 2396.
14965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Examples
14967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true())
14968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean"
14969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false())
14970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean"
14971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
14974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) {
14975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathObjectPtr str;
14976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int escape_reserved;
14977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferPtr target;
14978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cptr;
14979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar escape[4];
14980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CHECK_ARITY(2);
14982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    escape_reserved = xmlXPathPopBoolean(ctxt);
14984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    CAST_TO_STRING;
14986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str = valuePop(ctxt);
14987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    target = xmlBufferCreate();
14989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    escape[0] = '%';
14991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    escape[3] = 0;
14992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (target) {
14994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (cptr = str->stringval; *cptr; cptr++) {
14995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((*cptr >= 'A' && *cptr <= 'Z') ||
14996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*cptr >= 'a' && *cptr <= 'z') ||
14997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*cptr >= '0' && *cptr <= '9') ||
14998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cptr == '-' || *cptr == '_' || *cptr == '.' ||
14999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cptr == '!' || *cptr == '~' || *cptr == '*' ||
15000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cptr == '\''|| *cptr == '(' || *cptr == ')' ||
15001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*cptr == '%' &&
15002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((cptr[1] >= 'A' && cptr[1] <= 'F') ||
15003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[1] >= 'a' && cptr[1] <= 'f') ||
15004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[1] >= '0' && cptr[1] <= '9')) &&
15005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((cptr[2] >= 'A' && cptr[2] <= 'F') ||
15006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[2] >= 'a' && cptr[2] <= 'f') ||
15007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (cptr[2] >= '0' && cptr[2] <= '9'))) ||
15008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!escape_reserved &&
15009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (*cptr == ';' || *cptr == '/' || *cptr == '?' ||
15010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  *cptr == ':' || *cptr == '@' || *cptr == '&' ||
15011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  *cptr == '=' || *cptr == '+' || *cptr == '$' ||
15012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  *cptr == ','))) {
15013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlBufferAdd(target, cptr, 1);
15014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
15015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*cptr >> 4) < 10)
15016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[1] = '0' + (*cptr >> 4);
15017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
15018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[1] = 'A' - 10 + (*cptr >> 4);
15019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*cptr & 0xF) < 10)
15020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[2] = '0' + (*cptr & 0xF);
15021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
15022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    escape[2] = 'A' - 10 + (*cptr & 0xF);
15023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlBufferAdd(target, &escape[0], 3);
15025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
15029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlBufferContent(target)));
15030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlBufferFree(target);
15031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathReleaseObject(ctxt->context, str);
15032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterAllFunctions:
15036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the XPath context
15037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers all default XPath functions in this context
15039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
15041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt)
15042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean",
15044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathBooleanFunction);
15045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling",
15046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathCeilingFunction);
15047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count",
15048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathCountFunction);
15049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat",
15050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathConcatFunction);
15051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains",
15052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathContainsFunction);
15053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id",
15054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathIdFunction);
15055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false",
15056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathFalseFunction);
15057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor",
15058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathFloorFunction);
15059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last",
15060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathLastFunction);
15061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang",
15062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathLangFunction);
15063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name",
15064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathLocalNameFunction);
15065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not",
15066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNotFunction);
15067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name",
15068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNameFunction);
15069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri",
15070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNamespaceURIFunction);
15071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space",
15072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNormalizeFunction);
15073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number",
15074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathNumberFunction);
15075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position",
15076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathPositionFunction);
15077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round",
15078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathRoundFunction);
15079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string",
15080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathStringFunction);
15081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length",
15082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathStringLengthFunction);
15083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with",
15084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathStartsWithFunction);
15085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring",
15086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSubstringFunction);
15087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before",
15088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSubstringBeforeFunction);
15089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after",
15090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSubstringAfterFunction);
15091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum",
15092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathSumFunction);
15093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true",
15094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathTrueFunction);
15095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate",
15096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathTranslateFunction);
15097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri",
15099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions",
15100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlXPathEscapeUriFunction);
15101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPATH_ENABLED */
15104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xpath
15105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
15106