1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xpath.c: XML Path Language implementation 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath is a language for addressing parts of an XML document, 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * designed to be used by both XSLT and XPointer 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *f 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reference: W3C Recommendation 16 November 1999 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/1999/REC-xpath-19991116 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Public reference: 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/xpath 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Author: daniel@veillard.com 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TYPES_H 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/types.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_MATH_H 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <math.h> 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FLOAT_H 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <float.h> 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SIGNAL_H 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <signal.h> 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpath.h> 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpathInternals.h> 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpointer.h> 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/debugXML.h> 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/threads.h> 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/pattern.h> 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STREAMING 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define TODO \ 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_OPTIMIZED_NON_ELEM_COMPARISON: 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* If defined, this will use xmlXPathCmpNodesExt() instead of 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlXPathCmpNodes(). The new function is optimized comparison of 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* non-element nodes; actually it will speed up comparison only if 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlXPathOrderDocElems() was called in order to index the elements of 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* a tree in document order; Libxslt does such an indexing, thus it will 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* benefit from this optimization. 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_OPTIMIZED_NON_ELEM_COMPARISON 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_OPTIMIZED_FILTER_FIRST: 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* If defined, this will optimize expressions like "key('foo', 'val')[b][1]" 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* in a way, that it stop evaluation at the first node. 8260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott*/ 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_OPTIMIZED_FILTER_FIRST 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_DEBUG_OBJ_USAGE: 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Internal flag to enable tracking of how much XPath objects have been 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* created. 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEBUG_OBJ_USAGE */ 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There are a few spots where some tests are done which depend upon ascii 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data. These should be enhanced for full UTF8 support (see particularly 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT) 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 10260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 10360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Floating point stuff * 10460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef TRIO_REPLACE_STDIO 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TRIO_PUBLIC static 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "trionan.c" 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lack of portability of this section of the libc is annoying ! 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathNAN = 0; 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathPINF = 1; 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathNINF = -1; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double xmlXPathNZERO = 0; /* not exported from headers */ 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathInitialized = 0; 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathInit: 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the XPath environment 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathInit(void) { 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathInitialized) return; 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathPINF = trio_pinf(); 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNINF = trio_ninf(); 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNAN = trio_nan(); 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNZERO = trio_nzero(); 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInitialized = 1; 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNaN: 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a double value 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable isnan() function to detect whether a double 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is a NotaNumber. Based on trio code 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/ 14560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the value is a NaN, 0 otherwise 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNaN(double val) { 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(trio_isnan(val)); 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsInf: 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a double value 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable isinf() function to detect whether a double 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is a +Infinite or -Infinite. Based on trio code 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/ 16060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsInf(double val) { 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(trio_isinf(val)); 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* SCHEMAS or XPATH */ 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPATH_ENABLED 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetSign: 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a double value 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable function to detect the sign of a double 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified from trio code 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/ 17760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the value is Negative, 0 if positive 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetSign(double val) { 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(trio_signbit(val)); 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: when compatibility allows remove all "fake node libxslt" strings 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the test should just be name[0] = ' ' 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 19060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef DEBUG_XPATH_EXPRESSION 19160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define DEBUG_STEP 19260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define DEBUG_EXPR 19360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define DEBUG_EVAL_COUNTS 19460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNs xmlXPathXMLNamespaceStruct = { 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NAMESPACE_DECL, 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_XML_NAMESPACE, 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "xml", 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 20660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/* 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimizer is disabled only when threaded apps are detected while 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the library ain't compiled for thread safety. 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDisableOptimizer = 0; 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Error handling routines * 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XP_ERRORNULL: 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @X: the error code 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macro to raise an XPath error and return NULL. 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_ERRORNULL(X) \ 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { xmlXPathErr(ctxt, X); return(NULL); } 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The array xmlXPathErrorMessages corresponds to the enum xmlXPathError 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *xmlXPathErrorMessages[] = { 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Ok\n", 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Number encoding\n", 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unfinished literal\n", 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Start of literal\n", 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expected $ for variable reference\n", 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Undefined variable\n", 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid predicate\n", 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid expression\n", 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Missing closing curly brace\n", 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unregistered function\n", 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid operand\n", 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid type\n", 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid number of arguments\n", 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid context size\n", 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid context position\n", 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation error\n", 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Syntax error\n", 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Resource error\n", 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Sub resource error\n", 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Undefined namespace prefix\n", 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Encoding error\n", 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char out of XML range\n", 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid or incomplete context\n", 255df143a5041f03a22808b59c76698770b74692815Selim Gurun "Stack usage errror\n", 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "?? Unknown error ??\n" /* Must be last in the list! */ 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \ 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlXPathErrorMessages[0])) - 1) 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErrMemory: 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra) 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) { 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[200]; 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrPrintf(buf, 200, 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "Memory allocation failed : %s\n", 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extra); 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.message = (char *) xmlStrdup(buf); 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.message = (char *) 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(BAD_CAST "Memory allocation failed\n"); 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.domain = XML_FROM_XPATH; 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.code = XML_ERR_NO_MEMORY; 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != NULL) 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error(ctxt->userData, &ctxt->lastError); 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extra, NULL, NULL, 0, 0, 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed\n"); 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPErrMemory: 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra) 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, extra); 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_MEMORY_ERROR; 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt->context, extra); 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErr: 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a XPath parser context 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an XPath error 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErr(xmlXPathParserContextPtr ctxt, int error) 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((error < 0) || (error > MAXERRNO)) 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error = MAXERRNO; 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, 33843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich "%s", xmlXPathErrorMessages[error]); 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = error; 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context == NULL) { 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) ctxt->base, NULL, NULL, 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur - ctxt->base, 0, 34943ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich "%s", xmlXPathErrorMessages[error]); 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* cleanup current last error */ 35460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlResetError(&ctxt->context->lastError); 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.domain = XML_FROM_XPATH; 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK - 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_EXPRESSION_OK; 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.level = XML_ERR_ERROR; 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.node = ctxt->context->debugNode; 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->error != NULL) { 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->error(ctxt->context->userData, 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &ctxt->context->lastError); 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, ctxt->context->debugNode, XML_FROM_XPATH, 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) ctxt->base, NULL, NULL, 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur - ctxt->base, 0, 37343ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich "%s", xmlXPathErrorMessages[error]); 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPatherror: 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @file: the file name 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @line: the line number 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @no: the error number 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formats an error message. 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED, 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int line ATTRIBUTE_UNUSED, int no) { 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErr(ctxt, no); 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 39460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 39560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Utilities * 39660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerList: 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pointer-list for various purposes. 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlPointerList xmlPointerList; 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlPointerList *xmlPointerListPtr; 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlPointerList { 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **items; 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int number; 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Since such a list-handling is used in xmlschemas.c and libxslt 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* and here, we should make the functions public. 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 41660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlPointerListAddSize(xmlPointerListPtr list, 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *item, 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int initialSize) 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items == NULL) { 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (initialSize <= 0) 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initialSize = 1; 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->items = (void **) xmlMalloc( 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initialSize * sizeof(void *)); 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items == NULL) { 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPointerListCreate: allocating item\n"); 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->number = 0; 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size = initialSize; 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (list->size <= list->number) { 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size *= 2; 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->items = (void **) xmlRealloc(list->items, 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size * sizeof(void *)); 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items == NULL) { 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPointerListCreate: re-allocating item\n"); 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size = 0; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->items[list->number++] = item; 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListCreate: 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an xsltPointerList structure. 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a xsltPointerList structure or NULL in case of an error. 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlPointerListPtr 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListCreate(int initialSize) 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr ret; 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlMalloc(sizeof(xmlPointerList)); 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPointerListCreate: allocating item\n"); 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlPointerList)); 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (initialSize > 0) { 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListAddSize(ret, NULL, initialSize); 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->number = 0; 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListFree: 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees the xsltPointerList structure. This does not free 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content of the list. 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListFree(xmlPointerListPtr list) 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items != NULL) 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list->items); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 49060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 49160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Parser Types * 49260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Types are private: 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_END=0, 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_AND, 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_OR, 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_EQUAL, 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_CMP, 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_PLUS, 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_MULT, 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_UNION, 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_ROOT, 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_NODE, 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_RESET, /* 10 */ 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_COLLECT, 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_VALUE, /* 12 */ 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_VARIABLE, 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_FUNCTION, 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_ARG, 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_PREDICATE, 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_FILTER, /* 17 */ 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_SORT /* 18 */ 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ,XPATH_OP_RANGETO 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathOp; 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_ANCESTOR = 1, 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_ANCESTOR_OR_SELF, 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_ATTRIBUTE, 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_CHILD, 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_DESCENDANT, 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_DESCENDANT_OR_SELF, 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_FOLLOWING, 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_FOLLOWING_SIBLING, 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_NAMESPACE, 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_PARENT, 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_PRECEDING, 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_PRECEDING_SIBLING, 53760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott AXIS_SELF 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathAxisVal; 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_NONE = 0, 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE = 1, 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_PI = 2, 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_ALL = 3, 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_NS = 4, 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_NAME = 5 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTestVal; 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_NODE = 0, 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_COMMENT = XML_COMMENT_NODE, 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_TEXT = XML_TEXT_NODE, 55360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott NODE_TYPE_PI = XML_PI_NODE 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTypeVal; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_REWRITE_DOS_CHILD_ELEM 1 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathStepOp xmlXPathStepOp; 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathStepOp *xmlXPathStepOpPtr; 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathStepOp { 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathOp op; /* The identifier of the operation */ 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ch1; /* First child */ 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ch2; /* Second child */ 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value; 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value2; 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value3; 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *value4; 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *value5; 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *cache; 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *cacheURI; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rewriteType; 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathCompExpr { 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStep; /* Number of steps in this expression */ 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxStep; /* Maximum number of steps allocated */ 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOp *steps; /* ops for computation of this expression */ 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int last; /* index of last step in expression */ 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *expr; /* the expression being computed */ 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; /* the dictionnary to use if any */ 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb; 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *string; 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr stream; 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 59160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 59260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Forward declarations * 59360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj); 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj); 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr *first); 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isPredicate); 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 60860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 60960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Parser Type functions * 61060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * * 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCompExpr: 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new Xpath component 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCompExpr(void) { 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr cur; 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr)); 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "allocating component\n"); 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlXPathCompExpr)); 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->maxStep = 10; 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nbStep = 0; 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep * 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlXPathStepOp)); 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->steps == NULL) { 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "allocating steps\n"); 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp)); 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->last = -1; 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nb = 0; 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeCompExpr: 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: an XPATH comp 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by @comp 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCompExpr(xmlXPathCompExprPtr comp) 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op; 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict == NULL) { 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < comp->nbStep; i++) { 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &comp->steps[i]; 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value4 != NULL) { 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->op == XPATH_OP_VALUE) 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(op->value4); 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(op->value4); 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value5 != NULL) 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(op->value5); 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < comp->nbStep; i++) { 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &comp->steps[i]; 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value4 != NULL) { 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->op == XPATH_OP_VALUE) 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(op->value4); 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(comp->dict); 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps != NULL) { 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->steps); 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->string != NULL) { 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->string); 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream != NULL) { 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePatternList(comp->stream); 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->expr != NULL) { 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->expr); 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp); 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompExprAdd: 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled expression 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch1: first child index 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch2: second child index 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an op 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the first int value 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second int value 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value3: the third int value 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value4: the first string value 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value5: the second string value 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a step to an XPath Compiled Expression 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the index otherwise 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2, 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathOp op, int value, 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value2, int value3, void *value4, void *value5) { 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep >= comp->maxStep) { 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOp *real; 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep *= 2; 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project real = (xmlXPathStepOp *) xmlRealloc(comp->steps, 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep * sizeof(xmlXPathStepOp)); 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (real == NULL) { 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep /= 2; 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "adding step\n"); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps = real; 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->last = comp->nbStep; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].rewriteType = 0; 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].ch1 = ch1; 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].ch2 = ch2; 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].op = op; 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value = value; 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value2 = value2; 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value3 = value3; 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->dict != NULL) && 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) || 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (op == XPATH_OP_COLLECT))) { 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value4 != NULL) { 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value4 = (xmlChar *) 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *)xmlDictLookup(comp->dict, value4, -1); 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value4); 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value4 = NULL; 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value5 != NULL) { 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value5 = (xmlChar *) 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *)xmlDictLookup(comp->dict, value5, -1); 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value5); 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value5 = NULL; 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value4 = value4; 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value5 = value5; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].cache = NULL; 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp->nbStep++); 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompSwap: 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled expression 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: operation index 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Swaps 2 operations in the compiled expression 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompSwap(xmlXPathStepOpPtr op) { 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since this manipulates possibly shared variables, this is 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * disabled if one detects that the library is used in a multithreaded 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * application 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDisableOptimizer) 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = op->ch1; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->ch1 = op->ch2; 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->ch2 = tmp; 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \ 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprAdd(ctxt->comp, (op1), (op2), \ 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (op), (val), (val2), (val3), (val4), (val5)) 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \ 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1, \ 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (op), (val), (val2), (val3), (val4), (val5)) 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 80060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define PUSH_LEAVE_EXPR(op, val, val2) \ 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL) 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 80360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define PUSH_UNARY_EXPR(op, ch, val, val2) \ 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL) 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 80660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \ 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op), \ 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val), (val2), 0 ,NULL ,NULL) 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 81260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * XPath object cache structures * 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEFAULT_CACHE_ON */ 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL)) 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathContextCache xmlXPathContextCache; 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathContextCache *xmlXPathContextCachePtr; 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathContextCache { 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr nodesetObjs; /* contains xmlXPathObjectPtr */ 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr stringObjs; /* contains xmlXPathObjectPtr */ 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr booleanObjs; /* contains xmlXPathObjectPtr */ 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr numberObjs; /* contains xmlXPathObjectPtr */ 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr miscObjs; /* contains xmlXPathObjectPtr */ 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxNodeset; 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxString; 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxBoolean; 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxNumber; 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxMisc; 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedAll; 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedNodeset; 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedString; 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedBool; 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedNumber; 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedPoint; 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedRange; 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedLocset; 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedUsers; 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedXSLTTree; 84460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int dbgCachedUndefined; 84560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedAll; 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedNodeset; 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedString; 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedBool; 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedNumber; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedPoint; 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedRange; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedLocset; 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedUsers; 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedXSLTTree; 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedUndefined; 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 86460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Debugging related functions * 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 86860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define STRANGE \ 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error at %s:%d\n", \ 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) { 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 88343ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Node is NULL !\n"); 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 88660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_DOCUMENT_NODE) || 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_HTML_DOCUMENT_NODE)) { 89143ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " /\n"); 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_ATTRIBUTE_NODE) 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth); 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpOneNode(output, cur, depth); 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) { 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 90843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Node is NULL !\n"); 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 91160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur; 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpOneNode(output, tmp, depth); 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) { 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 93143ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NodeSet is NULL !\n"); 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 93460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Set contains %d nodes:\n", cur->nodeNr); 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) { 94043ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d", i + 1); 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1); 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) { 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) { 95743ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Value Tree is NULL !\n"); 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 96060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 96343ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d", i + 1); 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1); 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED) 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) { 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 97843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LocationSet is NULL !\n"); 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 98160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->locNr;i++) { 98543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d : ", i + 1); 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1); 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpObject: 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the FILE * to dump the output 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the object to inspect 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: indentation level 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the content of the object for debugging purposes 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) { 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) return; 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 101243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is empty (NULL)\n"); 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(cur->type) { 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is uninitialized\n"); 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a Node Set :\n"); 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth); 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is an XSLT value tree :\n"); 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth); 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a Boolean : "); 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->boolval) fprintf(output, "true\n"); 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else fprintf(output, "false\n"); 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (xmlXPathIsInf(cur->floatval)) { 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 1: 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : Infinity\n"); 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case -1: 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : -Infinity\n"); 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(cur->floatval)) { 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : NaN\n"); 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) { 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : 0\n"); 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : %0g\n", cur->floatval); 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a string : "); 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpString(output, cur->stringval); 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a point : index %d in node", cur->index); 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->user2 == NULL) || 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->user2 == cur->user) && (cur->index == cur->index2))) { 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a collapsed range :\n"); 106743ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->index >= 0) 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "index %d in ", cur->index); 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "node\n"); 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth + 1); 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a range :\n"); 107543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "From "); 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->index >= 0) 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "index %d in ", cur->index); 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "node\n"); 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth + 1); 108243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "To "); 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->index2 >= 0) 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "index %d in ", cur->index2); 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "node\n"); 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2, 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth + 1); 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED) 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a Location Set:\n"); 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpLocationSet(output, 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlLocationSetPtr) cur->user, depth); 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is user defined\n"); 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp, 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, int depth) { 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 111543ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op == NULL) { 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Step is NULL\n"); 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "END"); break; 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_AND: 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "AND"); break; 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_OR: 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OR"); break; 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_EQUAL: 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value) 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "EQUAL ="); 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "EQUAL !="); 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_CMP: 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value) 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "CMP <"); 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "CMP >"); 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!op->value2) 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "="); 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PLUS: 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS -"); 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS +"); 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 2) 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS unary -"); 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 3) 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS unary - -"); 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_MULT: 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MULT *"); 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MULT div"); 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MULT mod"); 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "UNION"); break; 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "ROOT"); break; 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NODE"); break; 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RESET"); break; 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SORT"); break; 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT: { 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value; 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test = (xmlXPathTestVal)op->value2; 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3; 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value4; 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value5; 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "COLLECT "); 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (axis) { 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR: 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'ancestors' "); break; 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR_OR_SELF: 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'ancestors-or-self' "); break; 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ATTRIBUTE: 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'attributes' "); break; 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_CHILD: 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'child' "); break; 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT: 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'descendant' "); break; 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT_OR_SELF: 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'descendant-or-self' "); break; 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING: 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'following' "); break; 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING_SIBLING: 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'following-siblings' "); break; 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_NAMESPACE: 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'namespace' "); break; 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PARENT: 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'parent' "); break; 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING: 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'preceding' "); break; 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING_SIBLING: 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'preceding-sibling' "); break; 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_SELF: 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'self' "); break; 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (test) { 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NONE: 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'none' "); break; 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_TYPE: 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'type' "); break; 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_PI: 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'PI' "); break; 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_ALL: 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'all' "); break; 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NS: 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'namespace' "); break; 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NAME: 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'name' "); break; 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_NODE: 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'node' "); break; 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_COMMENT: 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'comment' "); break; 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_TEXT: 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'text' "); break; 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_PI: 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'PI' "); break; 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%s:", prefix); 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%s", (const char *) name); 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: { 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4; 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "ELEM "); 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpObject(output, object, 0); 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto finish; 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VARIABLE: { 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value5; 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value4; 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "VARIABLE %s:%s", prefix, name); 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "VARIABLE %s", name); 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FUNCTION: { 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbargs = op->value; 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value5; 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value4; 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "FUNCTION %s:%s(%d args)", 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix, name, nbargs); 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "FUNCTION %s(%d args)", name, nbargs); 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ARG: fprintf(output, "ARG"); break; 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break; 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FILTER: fprintf(output, "FILTER"); break; 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break; 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "UNKNOWN %d\n", op->op); return; 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfinish: 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 >= 0) 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1); 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 >= 0) 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1); 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpCompExpr: 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the FILE * for the output 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled XPath expression 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the indentation level. 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the tree of the compiled XPath expression. 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth) { 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((output == NULL) || (comp == NULL)) return; 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 130243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich fprintf(output, "%s", shift); 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Compiled Expression : %d elements\n", 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nbStep); 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = comp->last; 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1); 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XPath object usage related debugging variables. 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUndefined = 0; 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNodeset = 0; 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterBool = 0; 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNumber = 0; 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterString = 0; 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterPoint = 0; 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterRange = 0; 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterLocset = 0; 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUsers = 0; 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterXSLTTree = 0; 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterAll = 0; 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUndefined = 0; 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNodeset = 0; 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalBool = 0; 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNumber = 0; 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalString = 0; 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalPoint = 0; 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalRange = 0; 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalLocset = 0; 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUsers = 0; 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalXSLTTree = 0; 133760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic int xmlXPathDebugObjTotalAll = 0; 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUndefined = 0; 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNodeset = 0; 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxBool = 0; 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNumber = 0; 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxString = 0; 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxPoint = 0; 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxRange = 0; 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxLocset = 0; 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUsers = 0; 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxXSLTTree = 0; 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxAll = 0; 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */ 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt) 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedAll = 0; 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNodeset = 0; 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedString = 0; 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedBool = 0; 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNumber = 0; 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedPoint = 0; 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedRange = 0; 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedLocset = 0; 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUsers = 0; 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedXSLTTree = 0; 137060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cache->dbgCachedUndefined = 0; 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedAll = 0; 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNodeset = 0; 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedString = 0; 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedBool = 0; 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNumber = 0; 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedPoint = 0; 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedRange = 0; 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedLocset = 0; 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUsers = 0; 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedXSLTTree = 0; 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUndefined = 0; 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 138460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined = 0; 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset = 0; 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool = 0; 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber = 0; 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString = 0; 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint = 0; 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange = 0; 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset = 0; 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers = 0; 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree = 0; 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll = 0; 139760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUndefined = 0; 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNodeset = 0; 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalBool = 0; 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNumber = 0; 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalString = 0; 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalPoint = 0; 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalRange = 0; 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalLocset = 0; 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUsers = 0; 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalXSLTTree = 0; 140860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjTotalAll = 0; 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUndefined = 0; 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNodeset = 0; 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxBool = 0; 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNumber = 0; 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxString = 0; 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxPoint = 0; 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxRange = 0; 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxLocset = 0; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUsers = 0; 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxXSLTTree = 0; 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxAll = 0; 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt, 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectType objType) 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isCached = 0; 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 143460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project isCached = 1; 143660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 143760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cache->dbgReusedAll++; 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUndefined++; 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNodeset++; 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedBool++; 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNumber++; 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedString++; 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedPoint++; 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedRange++; 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedLocset++; 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUsers++; 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedXSLTTree++; 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 147160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUndefined++; 147960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterUndefined++; 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterUndefined > 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUndefined) 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUndefined = 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined; 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNodeset++; 148860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterNodeset++; 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterNodeset > 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNodeset) 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNodeset = 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset; 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalBool++; 149760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterBool++; 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterBool > 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxBool) 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxBool = 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool; 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNumber++; 150660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterNumber++; 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterNumber > 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNumber) 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNumber = 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber; 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalString++; 151560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterString++; 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterString > 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxString) 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxString = 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString; 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalPoint++; 152460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterPoint++; 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterPoint > 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxPoint) 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxPoint = 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint; 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalRange++; 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange++; 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterRange > 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxRange) 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxRange = 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange; 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalLocset++; 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset++; 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterLocset > 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxLocset) 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxLocset = 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset; 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUsers++; 155160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterUsers++; 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterUsers > 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUsers) 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUsers = 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers; 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalXSLTTree++; 156060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugObjCounterXSLTTree++; 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterXSLTTree > 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxXSLTTree) 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxXSLTTree = 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree; 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalAll++; 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll++; 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterAll > 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxAll) 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxAll = 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll; 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt, 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectType objType) 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isCached = 0; 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 158960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott isCached = 1; 159060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedAll++; 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUndefined++; 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNodeset++; 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedBool++; 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNumber++; 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedString++; 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedPoint++; 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedRange++; 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedLocset++; 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUsers++; 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedXSLTTree++; 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 162660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined--; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset--; 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool--; 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber--; 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString--; 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint--; 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange--; 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset--; 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers--; 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree--; 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 166260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll--; 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */ 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt) 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int reqAll, reqNodeset, reqString, reqBool, reqNumber, 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqXSLTTree, reqUndefined; 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int caAll = 0, caNodeset = 0, caString = 0, caBool = 0, 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caNumber = 0, caXSLTTree = 0, caUndefined = 0; 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int reAll = 0, reNodeset = 0, reString = 0, reBool = 0, 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reNumber = 0, reXSLTTree = 0, reUndefined = 0; 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int leftObjs = xmlXPathDebugObjCounterAll; 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqAll = xmlXPathDebugObjTotalAll; 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNodeset = xmlXPathDebugObjTotalNodeset; 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqString = xmlXPathDebugObjTotalString; 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqBool = xmlXPathDebugObjTotalBool; 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNumber = xmlXPathDebugObjTotalNumber; 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqXSLTTree = xmlXPathDebugObjTotalXSLTTree; 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqUndefined = xmlXPathDebugObjTotalUndefined; 168560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# XPath object usage:\n"); 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reAll = cache->dbgReusedAll; 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqAll += reAll; 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reNodeset = cache->dbgReusedNodeset; 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNodeset += reNodeset; 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reString = cache->dbgReusedString; 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqString += reString; 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reBool = cache->dbgReusedBool; 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqBool += reBool; 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reNumber = cache->dbgReusedNumber; 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNumber += reNumber; 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reXSLTTree = cache->dbgReusedXSLTTree; 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqXSLTTree += reXSLTTree; 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reUndefined = cache->dbgReusedUndefined; 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqUndefined += reUndefined; 170760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caAll = cache->dbgCachedAll; 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caBool = cache->dbgCachedBool; 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caNodeset = cache->dbgCachedNodeset; 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caString = cache->dbgCachedString; 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caNumber = cache->dbgCachedNumber; 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caXSLTTree = cache->dbgCachedXSLTTree; 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caUndefined = cache->dbgCachedUndefined; 171560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->nodesetObjs) 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->nodesetObjs->number; 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->stringObjs) 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->stringObjs->number; 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->booleanObjs) 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->booleanObjs->number; 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->numberObjs) 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->numberObjs->number; 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->miscObjs) 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->miscObjs->number; 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 172860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 172960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott printf("# all\n"); 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqAll); 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# left : %d\n", leftObjs); 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalAll); 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reAll); 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxAll); 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# node-sets\n"); 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqNodeset); 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalNodeset); 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reNodeset); 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxNodeset); 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# strings\n"); 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqString); 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalString); 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reString); 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxString); 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# booleans\n"); 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqBool); 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalBool); 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reBool); 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxBool); 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# numbers\n"); 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqNumber); 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalNumber); 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reNumber); 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxNumber); 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# XSLT result tree fragments\n"); 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqXSLTTree); 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalXSLTTree); 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reXSLTTree); 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxXSLTTree); 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# undefined\n"); 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqUndefined); 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalUndefined); 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reUndefined); 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxUndefined); 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_DEBUG_OBJ_USAGE */ 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_DEBUG_ENABLED */ 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object caching * 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCache: 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new object cache 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCache just allocated. 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathContextCachePtr 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCache(void) 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr ret; 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache)); 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating object cache\n"); 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache)); 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxNodeset = 100; 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxString = 100; 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxBoolean = 100; 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxNumber = 100; 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxMisc = 100; 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheFreeObjectList(xmlPointerListPtr list) 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < list->number; i++) { 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = list->items[i]; 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that it is already assured that we don't need to 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * look out for namespace nodes in the node-set. 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval->nodeTab != NULL) 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodesetval->nodeTab); 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodesetval); 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll--; 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListFree(list); 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCache(xmlXPathContextCachePtr cache) 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache == NULL) 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->nodesetObjs) 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->nodesetObjs); 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->stringObjs) 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->stringObjs); 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->booleanObjs) 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->booleanObjs); 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->numberObjs) 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->numberObjs); 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->miscObjs) 185260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathCacheFreeObjectList(cache->miscObjs); 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cache); 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContextSetCache: 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @active: enables/disables (creates/frees) the cache 186160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @value: a value with semantics dependant on @options 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: options (currently only the value 0 is used) 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/frees an object cache on the XPath context. 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If activates XPath objects (xmlXPathObject) will be cached internally 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be reused. 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0: This will set the XPath object caching: 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will set the maximum number of XPath objects 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be cached per slot 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There are 5 slots for: node-set, string, number, boolean, and 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * misc objects. Use <0 for the default number (100). 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Other values for @options have currently no effect. 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the setting succeeded, and -1 on API or internal errors. 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextSetCache(xmlXPathContextPtr ctxt, 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int active, 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value, 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int options) 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (active) { 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache; 188860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache == NULL) { 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cache = xmlXPathNewCache(); 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache == NULL) 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache = (xmlXPathContextCachePtr) ctxt->cache; 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options == 0) { 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value < 0) 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = 100; 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxNodeset = value; 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxString = value; 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxNumber = value; 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxBoolean = value; 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxMisc = value; 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->cache != NULL) { 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cache = NULL; 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapNodeSet: 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapNodeSet(). 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val) 192360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache != NULL)) { 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->miscObjs != NULL) && 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 193260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = val; 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 194060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 194360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapNodeSet(val)); 194560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapString: 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapString(). 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object. 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val) 196060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache != NULL)) { 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->stringObjs != NULL) && 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->stringObjs->number != 0)) 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 196760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 196960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->stringObjs->items[--cache->stringObjs->number]; 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = val; 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to misc-cache. 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = val; 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapString(val)); 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewNodeSet: 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewNodeSet(). 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type NodeSet and initialize 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val) 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->nodesetObjs != NULL) && 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->nodesetObjs->number != 0)) 201860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use the nodset-cache. 202260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->nodesetObjs->items[--cache->nodesetObjs->number]; 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 202760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (val) { 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->nodesetval->nodeMax == 0) || 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val->type == XML_NAMESPACE_DECL)) 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 203160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathNodeSetAddUnique(ret->nodesetval, val); 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval->nodeTab[0] = val; 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval->nodeNr = 1; 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to misc-cache. 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(val); 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewNodeSet(val)); 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewCString: 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char * value 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewCString(). 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val) 207660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->stringObjs != NULL) && 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->stringObjs->number != 0)) 208260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 208460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->stringObjs->items[--cache->stringObjs->number]; 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(BAD_CAST val); 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(BAD_CAST val); 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewCString(val)); 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewString: 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewString(). 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val) 212560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->stringObjs != NULL) && 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->stringObjs->number != 0)) 213160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 213360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->stringObjs->items[--cache->stringObjs->number]; 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val); 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup((const xmlChar *)""); 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val); 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup((const xmlChar *)""); 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewString(val)); 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewBoolean: 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the boolean value 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewBoolean(). 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type boolean and of value @val 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val) 217960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->booleanObjs != NULL) && 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->booleanObjs->number != 0)) 218560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 218760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->booleanObjs->items[--cache->booleanObjs->number]; 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_BOOLEAN; 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = (val != 0); 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_BOOLEAN; 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = (val != 0); 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewBoolean(val)); 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewFloat: 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the double value 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewFloat(). 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type double and of value @val 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val) 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->numberObjs != NULL) && 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->numberObjs->number != 0)) 223360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 223560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->numberObjs->items[--cache->numberObjs->number]; 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NUMBER; 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->floatval = val; 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NUMBER; 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->floatval = val; 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewFloat(val)); 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertString: 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertString(). 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (cached) 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (or the operation is done directly on @val) 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { 227760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlChar *res = NULL; 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewCString(ctxt, "")); 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNodeSetToString(val->nodesetval); 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastBooleanToString(val->boolval); 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNumberToString(val->floatval); 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, val); 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewCString(ctxt, "")); 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheWrapString(ctxt, res)); 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheObjectCopy: 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the original object 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathObjectCopy(). 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire a copy of a given object 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused created object. 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_HAS_CACHE(ctxt)) { 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheWrapNodeSet(ctxt, 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetMerge(NULL, val->nodesetval))); 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewString(ctxt, val->stringval)); 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewBoolean(ctxt, val->boolval)); 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewFloat(ctxt, val->floatval)); 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathObjectCopy(val)); 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertBoolean: 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertBoolean(). 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 236160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewBoolean(ctxt, 0)); 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_BOOLEAN) 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val)); 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, val); 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertNumber: 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertNumber(). 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 238560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewFloat(ctxt, 0.0)); 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_NUMBER) 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val)); 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, val); 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 239760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Parser stacks related functions and macros * 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2402df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXPathSetFrame: 2403df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an XPath parser context 2404df143a5041f03a22808b59c76698770b74692815Selim Gurun * 2405df143a5041f03a22808b59c76698770b74692815Selim Gurun * Set the callee evaluation frame 2406df143a5041f03a22808b59c76698770b74692815Selim Gurun * 2407df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the previous frame value to be restored once done 2408df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 2409df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 2410df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXPathSetFrame(xmlXPathParserContextPtr ctxt) { 2411df143a5041f03a22808b59c76698770b74692815Selim Gurun int ret; 2412df143a5041f03a22808b59c76698770b74692815Selim Gurun 2413df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt == NULL) 2414df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 2415df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = ctxt->valueFrame; 2416df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->valueFrame = ctxt->valueNr; 2417df143a5041f03a22808b59c76698770b74692815Selim Gurun return(ret); 2418df143a5041f03a22808b59c76698770b74692815Selim Gurun} 2419df143a5041f03a22808b59c76698770b74692815Selim Gurun 2420df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 2421df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXPathPopFrame: 2422df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an XPath parser context 2423df143a5041f03a22808b59c76698770b74692815Selim Gurun * @frame: the previous frame value 2424df143a5041f03a22808b59c76698770b74692815Selim Gurun * 2425df143a5041f03a22808b59c76698770b74692815Selim Gurun * Remove the callee evaluation frame 2426df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 2427df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 2428df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXPathPopFrame(xmlXPathParserContextPtr ctxt, int frame) { 2429df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt == NULL) 2430df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 2431df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->valueNr < ctxt->valueFrame) { 2432df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR); 2433df143a5041f03a22808b59c76698770b74692815Selim Gurun } 2434df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->valueFrame = frame; 2435df143a5041f03a22808b59c76698770b74692815Selim Gurun} 2436df143a5041f03a22808b59c76698770b74692815Selim Gurun 2437df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePop: 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath evaluation context 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top XPath object from the value stack 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the XPath object just removed 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePop(xmlXPathParserContextPtr ctxt) 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->valueNr <= 0)) 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2452df143a5041f03a22808b59c76698770b74692815Selim Gurun 2453df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->valueNr <= ctxt->valueFrame) { 2454df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR); 2455df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 2456df143a5041f03a22808b59c76698770b74692815Selim Gurun } 2457df143a5041f03a22808b59c76698770b74692815Selim Gurun 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueNr--; 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueNr > 0) 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = ctxt->valueTab[ctxt->valueNr - 1]; 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = NULL; 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->valueTab[ctxt->valueNr]; 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab[ctxt->valueNr] = NULL; 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePush: 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath evaluation context 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the XPath object 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new XPath object on top of the value stack 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the number of items on the value stack 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value) 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (value == NULL)) return(-1); 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueNr >= ctxt->valueMax) { 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr *tmp; 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab, 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * ctxt->valueMax * 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->valueTab[0])); 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); 2488df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->error = XPATH_MEMORY_ERROR; 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueMax *= 2; 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab = tmp; 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab[ctxt->valueNr] = value; 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = value; 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->valueNr++); 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopBoolean: 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a boolean from the stack, handling conversion if needed. 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) { 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->type != XPATH_BOOLEAN) 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastToBoolean(obj); 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->boolval; 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNumber: 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a number from the stack, handling conversion if needed. 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNumber (xmlXPathParserContextPtr ctxt) { 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->type != XPATH_NUMBER) 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastToNumber(obj); 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->floatval; 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopString: 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a string from the stack, handling conversion if needed. 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopString (xmlXPathParserContextPtr ctxt) { 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar * ret; 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastToString(obj); /* this does required strdup */ 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: needs refactoring somewhere else */ 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->stringval == ret) 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->stringval = NULL; 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNodeSet: 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a node-set from the stack, handling conversion if needed. 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node-set 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) { 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(NULL); 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) { 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathStackIsNodeSet(ctxt)) { 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetTypeError(ctxt); 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->nodesetval; 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* to fix memory leak of not clearing obj->user */ 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->boolval && obj->user != NULL) 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList((xmlNodePtr) obj->user); 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = NULL; 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopExternal: 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops an external object from the stack, handling conversion if needed. 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the object 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopExternal (xmlXPathParserContextPtr ctxt) { 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void * ret; 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->value == NULL)) { 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type != XPATH_USERS) { 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetTypeError(ctxt); 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->user; 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->user = NULL; 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macros for accessing the content. Those should be used only by the parser, 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and not exported. 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dirty macros, i.e. one need to make assumption on the context to use them 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CUR_PTR return the current pointer to the xmlChar to be parsed. 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CUR returns the current xmlChar value, i.e. a 8 bit value 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in ISO-Latin or UTF-8. 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This should be used internally by the parser 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only to compare to ASCII values otherwise it would break when 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * running with UTF-8 encoding. 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to compare on ASCII based substring. 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * strings within the parser. 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CURRENT Returns the current char value, with the full decoding of 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 if we are using this mode. It returns an int. 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NEXT Skip to the next character, this does the proper decoding 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in UTF-8 mode. It also pop-up unfinished entities on the fly. 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It returns the pointer to the current xmlChar. 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur) 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->cur += (val) 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->cur[(val)] 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->cur 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l) 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define COPY_BUF(l,b,i,v) \ 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l == 1) b[i++] = (xmlChar) v; \ 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else i += xmlCopyChar(l,&b[i],v) 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l) ctxt->cur += l 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 267960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#define SKIP_BLANKS \ 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*(ctxt->cur))) NEXT 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT (*ctxt->cur) 2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_DIG 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_DIG 16 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_EPSILON 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_EPSILON 1E-9 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UPPER_DOUBLE 1E9 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LOWER_DOUBLE 1E-5 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LOWER_DOUBLE_EXP 5 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INTEGER_DIGITS DBL_DIG 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP)) 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EXPONENT_DIGITS (3 + 2) 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFormatNumber: 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @number: number to format 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: output buffer 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffersize: size of output buffer 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the number into a string representation. 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFormatNumber(double number, char buffer[], int buffersize) 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (xmlXPathIsInf(number)) { 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 1: 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffersize > (int)sizeof("Infinity")) 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "Infinity"); 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case -1: 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffersize > (int)sizeof("-Infinity")) 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "-Infinity"); 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(number)) { 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffersize > (int)sizeof("NaN")) 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "NaN"); 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (number == 0 && xmlXPathGetSign(number) != 0) { 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "0"); 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (number == ((int) number)) { 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char work[30]; 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *ptr, *cur; 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value = (int) number; 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = &buffer[0]; 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == 0) { 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr++ = '0'; 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(work, 29, "%d", value); 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &work[0]; 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur) && (ptr - buffer < buffersize)) { 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr++ = *cur++; 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ptr - buffer < buffersize) { 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr = 0; 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (buffersize > 0) { 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr--; 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr = 0; 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project For the dimension of work, 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DBL_DIG is number of significant digits 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EXPONENT is only needed for "scientific notation" 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3 is sign, decimal point, and terminating zero 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project LOWER_DOUBLE_EXP is max number of leading zeroes in fraction 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Note that this dimension is slightly (a few characters) 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project larger than actually necessary. 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char work[DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP]; 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int integer_place, fraction_place; 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *ptr; 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *after_fraction; 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double absolute_value; 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project absolute_value = fabs(number); 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First choose format - scientific or regular floating point. 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In either case, result is in work, and after_fraction points 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just past the fractional part. 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ((absolute_value > UPPER_DOUBLE) || 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (absolute_value < LOWER_DOUBLE)) && 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (absolute_value != 0.0) ) { 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use scientific notation */ 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = DBL_DIG - 1; 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = snprintf(work, sizeof(work),"%*.*e", 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project integer_place, fraction_place, number); 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((size > 0) && (work[size] != 'e')) size--; 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use regular notation */ 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (absolute_value > 0.0) { 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project integer_place = (int)log10(absolute_value); 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (integer_place > 0) 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = DBL_DIG - integer_place - 1; 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = DBL_DIG - integer_place; 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = 1; 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = snprintf(work, sizeof(work), "%0.*f", 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place, number); 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Remove fractional trailing zeroes */ 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project after_fraction = work + size; 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = after_fraction; 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*(--ptr) == '0') 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ; 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ptr != '.') 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr++; 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*ptr++ = *after_fraction++) != 0); 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Finally copy result back to caller */ 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = strlen(work) + 1; 280948d0ed6753beba44f3aa579be29278eecdca10adSelim Gurun if (size > buffersize && buffersize <= (int)sizeof(work)) { 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project work[buffersize - 1] = 0; 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = buffersize; 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memmove(buffer, work, size); 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle NodeSets * 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathOrderDocElems: 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: an input document 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Call this routine to speed up XPath computation on static documents. 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This stamps all the element nodes with the document order 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Like for line information, the order is kept in the element->content 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field, the value stored is actually - the node number (starting at -1) 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be able to differentiate from line numbers. 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of elements found in the document or -1 in case 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of error. 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectlong 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathOrderDocElems(xmlDocPtr doc) { 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long count = 0; 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = doc->children; 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = (void *) (-(++count)); 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) doc) { 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = NULL; 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(count); 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodes: 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1: the first node 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2: the second node 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it's the same node, -1 otherwise 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth1, depth2; 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int attr1 = 0, attr2 = 0; 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr attrNode1 = NULL, attrNode2 = NULL; 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, root; 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a couple of optimizations which will avoid computations in most cases 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) /* trivial case */ 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->type == XML_ATTRIBUTE_NODE) { 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr1 = 1; 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrNode1 = node1; 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->type == XML_ATTRIBUTE_NODE) { 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr2 = 1; 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrNode2 = node2; 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) { 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1 == attr2) { 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* not required, but we keep attributes in order */ 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1 != 0) { 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = attrNode2->prev; 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == attrNode1) 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr2 == 1) 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_NAMESPACE_DECL) || 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_NAMESPACE_DECL)) 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) { 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long l1, l2; 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compute depth to root 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node1) 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2++; 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = cur; 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1++; 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Distinct document (or distinct entities :-( ) case. 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != cur) { 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * get the nearest common ancestor. 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth1 > depth2) { 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1--; 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth2 > depth1) { 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2--; 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node1->parent != node2->parent) { 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* should not happen but just in case ... */ 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find who's first. 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) { 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long l1, l2; 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cur = node1->next;cur != NULL;cur = cur->next) 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); /* assume there is no sibling list corruption */ 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodesExt: 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1: the first node 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2: the second node 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order. 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is optimized for handling of non-element nodes. 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it's the same node, -1 otherwise 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth1, depth2; 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int misc = 0, precedence1 = 0, precedence2 = 0; 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr miscNode1 = NULL, miscNode2 = NULL; 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, root; 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long l1, l2; 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) 3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 304860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a couple of optimizations which will avoid computations in most cases 305160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (node1->type) { 3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->type == XML_ELEMENT_NODE) { 3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */ 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) 305860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 306660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott goto turtle_comparison; 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 1; /* element is owner */ 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode1 = node1; 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: { 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode1 = node1; 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find nearest element node. 308260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->prev != NULL) { 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->prev; 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->type == XML_ELEMENT_NODE) { 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 3; /* element in prev-sibl axis */ 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->prev == NULL) { 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 2; /* element is parent */ 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Are there any cases, where the 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent of such a node is not an element node? 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 2; /* element is parent */ 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) || 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 <= (long) node1->content)) { 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback for whatever case. 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = miscNode1; 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 0; 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: why do we return 1 for namespace nodes? 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 312260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (node2->type) { 312460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ELEMENT_NODE: 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 1; /* element is owner */ 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode2 = node2; 3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: { 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode2 = node2; 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->prev != NULL) { 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->prev; 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->type == XML_ELEMENT_NODE) { 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 3; /* element in prev-sibl axis */ 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->prev == NULL) { 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 2; /* element is parent */ 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 2; /* element is parent */ 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 315360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) || 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 <= (long) node1->content)) 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = miscNode2; 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 0; 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (misc) { 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) { 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (precedence1 == precedence2) { 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ugly case; but normally there aren't many 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * adjacent non-element nodes around. 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = miscNode2->prev; 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == miscNode1) 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate based on higher precedence wrt to the element. 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: This assumes attributes are sorted before content. 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is this 100% correct? 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (precedence1 < precedence2) 319160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(1); 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 319360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(-1); 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 319560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Special case: One of the helper-elements is contained by the other. 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <foo> 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <node2> 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <node1>Text-1(precedence1 == 2)</node1> 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * </node2> 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Text-6(precedence2 == 3) 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * </foo> 320460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((precedence2 == 3) && (precedence1 > 1)) { 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node1->parent; 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur) { 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 321360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((precedence1 == 3) && (precedence2 > 1)) { 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node2->parent; 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur) { 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node1) 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 322160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 322660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((node1->type == XML_ELEMENT_NODE) && 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 323060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (node1->doc == node2->doc)) { 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectturtle_comparison: 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compute depth to root 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node1) 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2++; 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = cur; 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1++; 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Distinct document (or distinct entities :-( ) case. 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != cur) { 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * get the nearest common ancestor. 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth1 > depth2) { 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1--; 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth2 > depth1) { 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2--; 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node1->parent != node2->parent) { 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* should not happen but just in case ... */ 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find who's first. 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 329860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (node1->doc == node2->doc)) { 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cur = node1->next;cur != NULL;cur = cur->next) 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); /* assume there is no sibling list corruption */ 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */ 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetSort: 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sort the node set in document order 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetSort(xmlNodeSetPtr set) { 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, incr, len; 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set == NULL) 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use Shell's sort to sort the node-set */ 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = set->nodeNr; 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (incr = len / 2; incr > 0; incr /= 2) { 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = incr; i < len; i++) { 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j = i - incr; 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (j >= 0) { 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathCmpNodesExt(set->nodeTab[j], 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j + incr]) == -1) 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathCmpNodes(set->nodeTab[j], 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j + incr]) == -1) 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = set->nodeTab[j]; 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j] = set->nodeTab[j + incr]; 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j + incr] = tmp; 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j -= incr; 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NODESET_DEFAULT 10 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDupNs: 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the parent node of the namespace XPath node 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the libxml namespace declaration node. 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace node in libxml don't match the XPath semantic. In a node set 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic. 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) { 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr cur; 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns); 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Namespace and fill the fields. 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "duplicating namespace\n"); 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlNs)); 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_NAMESPACE_DECL; 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->href != NULL) 338660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur->href = xmlStrdup(ns->href); 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) 338860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur->prefix = xmlStrdup(ns->prefix); 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = (xmlNsPtr) node; 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) cur); 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetFreeNs: 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the XPath namespace node found in a nodeset. 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace nodes in libxml don't match the XPath semantic. In a node set 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic. Check if such a node needs to be freed 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetFreeNs(xmlNsPtr ns) { 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) { 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->href != NULL) 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)ns->href); 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)ns->prefix); 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreate: 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an initial xmlNodePtr, or NULL 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreate(xmlNodePtr val) { 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) { 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->nodeTab == NULL) { 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret->nodeTab, 0 , 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeMax = XML_NODESET_DEFAULT; 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val; 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab[ret->nodeNr++] = 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab[ret->nodeNr++] = val; 3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreateSize: 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the initial size of the set 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreateSize(int size) { 3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size < XML_NODESET_DEFAULT) 3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = XML_NODESET_DEFAULT; 3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr)); 3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->nodeTab == NULL) { 3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr)); 348260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ret->nodeMax = size; 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetContains: 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the node-set 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the node 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * checks whether @cur contains @val 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @cur contains @val, false (0) otherwise 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) { 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (val == NULL)) return(0); 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < cur->nodeNr; i++) { 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) { 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns1, ns2; 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns1 = (xmlNsPtr) val; 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns2 = (xmlNsPtr) cur->nodeTab[i]; 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns1 == ns2) 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns1->next != NULL) && (ns2->next == ns1->next) && 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ns1->prefix, ns2->prefix))) 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < cur->nodeNr; i++) { 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i] == val) 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddNs: 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the hosting node 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a the namespace node 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new namespace node to an existing NodeSet 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) { 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 353560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (ns == NULL) || (node == NULL) || 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->type != XML_NAMESPACE_DECL) || 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type != XML_ELEMENT_NODE)) 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * prevent duplicates 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) { 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodeTab[i] != NULL) && 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) && 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) && 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix))) 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeMax == 0) { 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab == NULL) { 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax = XML_NODESET_DEFAULT; 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->nodeNr == cur->nodeMax) { 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3569df143a5041f03a22808b59c76698770b74692815Selim Gurun temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3575df143a5041f03a22808b59c76698770b74692815Selim Gurun cur->nodeMax *= 2; 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = temp; 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns); 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAdd: 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a new xmlNodePtr 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) { 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (val == NULL)) return; 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' ')) 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; /* an XSLT fake node */ 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * prevent duplcates 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i] == val) return; 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeMax == 0) { 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab == NULL) { 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax = XML_NODESET_DEFAULT; 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->nodeNr == cur->nodeMax) { 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3622df143a5041f03a22808b59c76698770b74692815Selim Gurun temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3628df143a5041f03a22808b59c76698770b74692815Selim Gurun cur->nodeMax *= 2; 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = temp; 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val; 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 363460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur->nodeTab[cur->nodeNr++] = 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = val; 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddUnique: 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a new xmlNodePtr 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet, optimized version 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when we are sure the node is not already in the set. 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) { 3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (val == NULL)) return; 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' ')) 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; /* an XSLT fake node */ 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeMax == 0) { 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab == NULL) { 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax = XML_NODESET_DEFAULT; 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->nodeNr == cur->nodeMax) { 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3674df143a5041f03a22808b59c76698770b74692815Selim Gurun temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = temp; 3681df143a5041f03a22808b59c76698770b74692815Selim Gurun cur->nodeMax *= 2; 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val; 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 368660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur->nodeTab[cur->nodeNr++] = 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = val; 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMerge: 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1: the first NodeSet or NULL 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2: the second NodeSet 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error. 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, initNr, skip; 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n1, n2; 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2 == NULL) return(val1); 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1 == NULL) { 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathNodeSetCreate(NULL); 371060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (val1 == NULL) 371160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: The optimization won't work in every case, since 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * those nasty namespace nodes need to be added with 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDupNs() to the set; thus a pure 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * memcpy is not possible. 3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there was a flag on the nodesetval, indicating that 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some temporary nodes are in, that would be helpfull. 3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 372160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization: Create an equally sized node-set 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and memcpy the content. 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathNodeSetCreateSize(val2->nodeNr); 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1 == NULL) 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2->nodeNr != 0) { 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2->nodeNr == 1) 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *(val1->nodeTab) = *(val2->nodeTab); 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(val1->nodeTab, val2->nodeTab, 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val2->nodeNr * sizeof(xmlNodePtr)); 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeNr = val2->nodeNr; 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val1); 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initNr = val1->nodeNr; 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < val2->nodeNr;i++) { 374560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott n2 = val2->nodeTab[i]; 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against duplicates 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip = 0; 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < initNr; j++) { 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n1 = val1->nodeTab[j]; 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n1 == n2) { 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip = 1; 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((n1->type == XML_NAMESPACE_DECL) && 375660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (n2->type == XML_NAMESPACE_DECL)) { 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(((xmlNsPtr) n1)->prefix, 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlNsPtr) n2)->prefix))) 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip = 1; 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (skip) 3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeMax == 0) { 3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeTab == NULL) { 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(val1->nodeTab, 0 , 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax = XML_NODESET_DEFAULT; 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (val1->nodeNr == val1->nodeMax) { 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3785df143a5041f03a22808b59c76698770b74692815Selim Gurun temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 2 * 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = temp; 3792df143a5041f03a22808b59c76698770b74692815Selim Gurun val1->nodeMax *= 2; 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2->type == XML_NAMESPACE_DECL) { 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) n2; 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = n2; 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val1); 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* xmlXPathNodeSetMergeUnique() is currently not used anymore */ 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeUnique: 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1: the first NodeSet or NULL 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2: the second NodeSet 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error. 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2 == NULL) return(val1); 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1 == NULL) { 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathNodeSetCreate(NULL); 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 382560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (val1 == NULL) 382660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < val2->nodeNr;i++) { 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeMax == 0) { 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeTab == NULL) { 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(val1->nodeTab, 0 , 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax = XML_NODESET_DEFAULT; 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (val1->nodeNr == val1->nodeMax) { 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax *= 2; 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = temp; 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) { 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i]; 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i]; 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val1); 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* xmlXPathNodeSetMergeUnique() is currently not used anymore */ 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClear: 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1: the first NodeSet or NULL 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2: the second NodeSet 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2. 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for duplicate nodes. Clears set2. 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error. 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2, 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNullEntries) 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set1 == NULL) && (hasNullEntries == 0)) { 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that doing a memcpy of the list, namespace nodes are 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just assigned to set1, since set2 is cleared anyway. 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set2->nodeNr != 0) { 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(set1->nodeTab, set2->nodeTab, 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr * sizeof(xmlNodePtr)); 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeNr = set2->nodeNr; 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, initNbSet1; 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n1, n2; 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 390360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott set1 = xmlXPathNodeSetCreate(NULL); 390460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (set1 == NULL) 390560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 390760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott initNbSet1 = set1->nodeNr; 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < set2->nodeNr;i++) { 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n2 = set2->nodeTab[i]; 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip NULLed entries. 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2 == NULL) 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip duplicates. 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < initNbSet1; j++) { 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n1 = set1->nodeTab[j]; 392060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (n1 == n2) { 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_node; 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((n1->type == XML_NAMESPACE_DECL) && 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (n2->type == XML_NAMESPACE_DECL)) 392460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(((xmlNsPtr) n1)->prefix, 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlNsPtr) n2)->prefix))) 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the namespace node. 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeTab[i] = NULL; 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) n2); 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_node; 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeMax == 0) { 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = (xmlNodePtr *) xmlMalloc( 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeTab == NULL) { 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(set1->nodeTab, 0, 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeMax = XML_NODESET_DEFAULT; 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (set1->nodeNr >= set1->nodeMax) { 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 395360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc( 3955df143a5041f03a22808b59c76698770b74692815Selim Gurun set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = temp; 3961df143a5041f03a22808b59c76698770b74692815Selim Gurun set1->nodeMax *= 2; 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2->type == XML_NAMESPACE_DECL) { 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) n2; 396560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab[set1->nodeNr++] = 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab[set1->nodeNr++] = n2; 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectskip_node: 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {} 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr = 0; 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(set1); 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClearNoDupls: 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1: the first NodeSet or NULL 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2: the second NodeSet 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2. 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Doesn't chack for duplicate nodes. Clears set2. 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error. 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2, 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNullEntries) 399360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set2 == NULL) 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(set1); 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set1 == NULL) && (hasNullEntries == 0)) { 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that doing a memcpy of the list, namespace nodes are 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just assigned to set1, since set2 is cleared anyway. 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set2->nodeNr != 0) { 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(set1->nodeTab, set2->nodeTab, 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr * sizeof(xmlNodePtr)); 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeNr = set2->nodeNr; 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n2; 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreate(NULL); 401560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (set1 == NULL) 401660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 401760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < set2->nodeNr;i++) { 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n2 = set2->nodeTab[i]; 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip NULLed entries. 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2 == NULL) 402460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott continue; 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeMax == 0) { 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = (xmlNodePtr *) xmlMalloc( 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeTab == NULL) { 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(set1->nodeTab, 0, 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeMax = XML_NODESET_DEFAULT; 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (set1->nodeNr >= set1->nodeMax) { 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 403760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc( 4039df143a5041f03a22808b59c76698770b74692815Selim Gurun set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = temp; 4045df143a5041f03a22808b59c76698770b74692815Selim Gurun set1->nodeMax *= 2; 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab[set1->nodeNr++] = n2; 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr = 0; 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(set1); 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDel: 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an xmlNodePtr 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an xmlNodePtr from an existing NodeSet 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) { 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return; 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) return; 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * find node in nodeTab 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i] == val) break; 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= cur->nodeNr) { /* not found */ 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 407660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n", 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val->name); 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodeTab[i] != NULL) && 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodeTab[i]->type == XML_NAMESPACE_DECL)) 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]); 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeNr--; 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;i < cur->nodeNr;i++) 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[i] = cur->nodeTab[i + 1]; 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr] = NULL; 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetRemove: 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the index to remove 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an entry from an existing NodeSet list. 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) { 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return; 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val >= cur->nodeNr) return; 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodeTab[val] != NULL) && 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodeTab[val]->type == XML_NAMESPACE_DECL)) 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]); 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeNr--; 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;val < cur->nodeNr;val++) 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[val] = cur->nodeTab[val + 1]; 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr] = NULL; 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSet: 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlNodeSetPtr to free 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound (not the actual nodes !). 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSet(xmlNodeSetPtr obj) { 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab != NULL) { 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < obj->nodeNr;i++) 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->nodeTab[i] != NULL) && 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (obj->nodeTab[i]->type == XML_NAMESPACE_DECL)) 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodeTab); 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClear: 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set to clear 413660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from all temporary XPath objects (e.g. namespace nodes 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed), but does *not* free the list itself. Sets the length of the 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * list to 0. 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set == NULL) || (set->nodeNr <= 0)) 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (hasNsNodes) { 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 414960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < set->nodeNr; i++) { 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = set->nodeTab[i]; 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) node); 415560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeNr = 0; 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClearFromPos: 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set to be cleared 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pos: the start position to clear from 416460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from temporary XPath objects (e.g. namespace nodes 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed) starting with the entry at @pos, but does *not* free the list 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * itself. Sets the length of the list to @pos. 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes) 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr)) 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((hasNsNodes)) { 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 417760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = pos; i < set->nodeNr; i++) { 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = set->nodeTab[i]; 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) node); 418360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeNr = pos; 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeValueTree: 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlNodeSetPtr to free 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound and the actual tree, this is different 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from xmlXPathFreeNodeSet() 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj) { 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab != NULL) { 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < obj->nodeNr;i++) { 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab[i] != NULL) { 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) { 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList(obj->nodeTab[i]); 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodeTab); 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(DEBUG) || defined(DEBUG_STEP) 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGenericErrorContextNodeSet: 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: a FILE * for the output 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlNodeSetPtr to display 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Quick display of a NodeSet 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) { 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) output = xmlGenericErrorContext; 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NodeSet == NULL !\n"); 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeNr == 0) { 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NodeSet is empty\n"); 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab == NULL) { 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " nodeTab == NULL !\n"); 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < obj->nodeNr; i++) { 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab[i] == NULL) { 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " NULL !\n"); 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) || 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE)) 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " /"); 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (obj->nodeTab[i]->name == NULL) 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " noname!"); 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else fprintf(output, " %s", obj->nodeTab[i]->name); 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSet: 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSet(xmlNodePtr val) { 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(val); 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewValueTree: 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the tree root @val 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewValueTree(xmlNodePtr val) { 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating result value tree\n"); 4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_XSLT_TREE; 4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 1; 4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = (void *) val; 4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(val); 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE); 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSetList: 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an existing NodeSet 4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the Nodeset @val 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSetList(xmlNodeSetPtr val) 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val->nodeTab == NULL) 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewNodeSet(NULL); 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewNodeSet(val->nodeTab[0]); 433660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret) 433760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott for (i = 1; i < val->nodeNr; ++i) 433860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]); 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapNodeSet: 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapNodeSet(xmlNodeSetPtr val) { 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating node set object\n"); 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = val; 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSetList: 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: an existing NodeSetList object 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the list contrary to xmlXPathFreeObject(). 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) { 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(NULL, obj->type); 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDifference: 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets difference() function: 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:difference (node-set, node-set) 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the difference between the two node sets, or nodes1 if 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nodes2 is empty 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l1; 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = xmlXPathNodeSetGetLength(nodes1); 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l1; i++) { 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes1, i); 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathNodeSetContains(nodes2, cur)) 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIntersection: 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets intersection() function: 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:intersection (node-set, node-set) 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node set comprising the nodes that are within both the 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node sets passed as arguments 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL); 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l1; 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 443760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 443860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = xmlXPathNodeSetGetLength(nodes1); 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l1; i++) { 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes1, i); 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetContains(nodes2, cur)) 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinctSorted: 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function: 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:distinct (node-set) 446060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it is empty 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinctSorted (xmlNodeSetPtr nodes) { 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr hash; 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar * strval; 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes)) 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 447660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 447760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes); 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hash = xmlHashCreate (l); 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l; i++) { 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes, i); 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strval = xmlXPathCastNodeToString(cur); 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashLookup(hash, strval) == NULL) { 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashAddEntry(hash, strval, strval); 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(strval); 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(hash, (xmlHashDeallocator) xmlFree); 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinct: 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function: 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:distinct (node-set) 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsDistinctSorted 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called with the sorted node-set 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it is empty 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinct (xmlNodeSetPtr nodes) { 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes)) 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes); 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathDistinctSorted(nodes)); 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathHasSameNodes: 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets has-same-nodes function: 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean set:has-same-node(node-set, node-set) 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @nodes1 shares any node with @nodes2, false (0) 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1) || 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetIsEmpty(nodes2)) 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes1); 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l; i++) { 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes1, i); 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetContains(nodes2, cur)) 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeadingSorted: 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order, 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 456660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 456760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes) || 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlXPathNodeSetContains(nodes, node))) 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes); 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l; i++) { 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes, i); 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node) 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeading: 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called. 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order, 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) { 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes); 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeLeadingSorted(nodes, node)); 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeadingSorted: 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set, sorted by document order 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set, sorted by document order 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeLeadingSorted(nodes1, 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 1))); 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeading: 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #exslSetsLeadingSorted is called. 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeSetCreate(NULL)); 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes1); 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes2); 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeLeadingSorted(nodes1, 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 1))); 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailingSorted: 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order, 4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { 4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 467060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 467160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes) || 4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlXPathNodeSetContains(nodes, node))) 4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes); 4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = l - 1; i >= 0; i--) { 4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes, i); 4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node) 4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ret); /* bug 413451 */ 4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailing: 4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set 4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted 4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called. 4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order, 4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) { 4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes); 4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeTrailingSorted(nodes, node)); 4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailingSorted: 4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set, sorted by document order 4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set, sorted by document order 4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2 4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeTrailingSorted(nodes1, 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 0))); 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailing: 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #xmlXPathTrailingSorted is called. 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeSetCreate(NULL)); 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes1); 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes2); 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeTrailingSorted(nodes1, 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 0))); 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle extra functions * 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFunc: 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the function implementation or NULL 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 476960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name, 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction f) { 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f)); 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncNS: 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the function namespace URI 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the function implementation or NULL 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri, xmlXPathFunction f) { 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcHash == NULL) 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcHash = xmlHashCreate(0); 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcHash == NULL) 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f == NULL) 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL)); 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, XML_CAST_FPTR(f))); 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncLookup: 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the lookup function 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @funcCtxt: the lookup data 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers an external mechanism to do function lookup. 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFuncLookupFunc f, 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *funcCtxt) { 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcLookupFunc = f; 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcLookupData = funcCtxt; 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookup: 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function. 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcLookupFunc != NULL) { 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction ret; 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFuncLookupFunc f; 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = ctxt->funcLookupFunc; 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = f(ctxt->funcLookupData, name, NULL); 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathFunctionLookupNS(ctxt, name, NULL)); 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookupNS: 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the function namespace URI 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function. 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri) { 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction ret; 486360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcLookupFunc != NULL) { 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFuncLookupFunc f; 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = ctxt->funcLookupFunc; 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = f(ctxt->funcLookupData, name, ns_uri); 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcHash == NULL) 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->funcHash, name, ns_uri); 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredFuncsCleanup: 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered functions 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) { 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->funcHash, NULL); 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcHash = NULL; 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle Variables * 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariable: 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the variable value or NULL 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 491760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottint 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name, 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr value) { 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value)); 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableNS: 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the variable namespace URI 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the variable value or NULL 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri, 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr value) { 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varHash == NULL) 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varHash = xmlHashCreate(0); 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varHash == NULL) 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) 494960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri, 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlXPathFreeObject)); 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri, 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) value, 4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlXPathFreeObject)); 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableLookup: 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the lookup function 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: the lookup data 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * register an external mechanism to do variable lookup 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt, 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathVariableLookupFunc f, void *data) { 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varLookupFunc = f; 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varLookupData = data; 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookup: 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * variable value. 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a copy of the value or NULL if not found 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varLookupFunc != NULL) { 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->varLookupData, name, NULL); 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathVariableLookupNS(ctxt, name, NULL)); 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookupNS: 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the variable namespace URI 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given 500560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * variable value. 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the a copy of the value or NULL if not found 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri) { 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varLookupFunc != NULL) { 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->varLookupData, name, ns_uri); 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) return(ret); 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varHash == NULL) 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr) 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(ctxt->varHash, name, ns_uri))); 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredVariablesCleanup: 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) { 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject); 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varHash = NULL; 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterNs: 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5050df143a5041f03a22808b59c76698770b74692815Selim Gurun * @prefix: the namespace prefix cannot be NULL or empty string 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the namespace name 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new namespace. If @ns_uri is NULL it unregisters 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix, 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri) { 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5065df143a5041f03a22808b59c76698770b74692815Selim Gurun if (prefix[0] == 0) 5066df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsHash == NULL) 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nsHash = xmlHashCreate(10); 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsHash == NULL) 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns_uri == NULL) 5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry(ctxt->nsHash, prefix, 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlFree)); 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri), 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlFree)); 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNsLookup: 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the namespace prefix value 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the namespace declaration array of the context for the given 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace name associated to the given prefix 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value or NULL if not found 5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar * 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) { 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_XML_NAMESPACE 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(prefix, (const xmlChar *) "xml")) 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(XML_XML_NAMESPACE); 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->namespaces != NULL) { 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nsNr;i++) { 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->namespaces[i] != NULL) && 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->namespaces[i]->prefix, prefix))) 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->namespaces[i]->href); 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix)); 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredNsCleanup: 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) { 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree); 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nsHash = NULL; 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle Values * 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Allocations are terrible, one needs to optimize all this !!! */ 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewFloat: 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the double value 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type double and of value @val 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewFloat(double val) { 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating float object\n"); 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NUMBER; 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->floatval = val; 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER); 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewBoolean: 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the boolean value 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type boolean and of value @val 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewBoolean(int val) { 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating boolean object\n"); 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_BOOLEAN; 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = (val != 0); 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN); 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewString: 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewString(const xmlChar *val) { 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating string object\n"); 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val); 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup((const xmlChar *)""); 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapString: 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object. 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapString (xmlChar *val) { 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating string object\n"); 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = val; 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCString: 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char * value 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCString(const char *val) { 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating string object\n"); 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(BAD_CAST val); 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapCString: 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char * value 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps a string into an XPath object. 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapCString (char * val) { 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapString((xmlChar *)(val))); 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapExternal: 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the user data 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val data into an XPath object. 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapExternal (void *val) { 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating user object\n"); 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_USERS; 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = val; 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS); 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathObjectCopy: 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the original object 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate a new copy of a given object 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectCopy(xmlXPathObjectPtr val) { 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "copying object\n"); 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret, val , (size_t) sizeof(xmlXPathObject)); 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, val->type); 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val->stringval); 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project this previous handling is no longer correct, and can cause some serious 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project problems (ref. bug 145547) 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val->nodesetval != NULL) && 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val->nodesetval->nodeTab != NULL)) { 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, tmp; 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr top; 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 1; 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project top = xmlNewDoc(NULL); 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project top->name = (char *) 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(val->nodesetval->nodeTab[0]->name); 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = top; 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (top != NULL) { 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project top->doc = top; 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = val->nodesetval->nodeTab[0]->children; 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlDocCopyNode(cur, top, 1); 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAddChild((xmlNodePtr) top, tmp); 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top); 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(NULL); 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Deallocate the copied tree value */ 5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval); 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Do not deallocate the copied tree value */ 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr loc = val->user; 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc); 5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = val->user; 539060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathObjectCopy: unsupported type %d\n", 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val->type); 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeObject: 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the object to free 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathObjectPtr object. 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeObject(xmlXPathObjectPtr obj) { 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->boolval) { 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->user != NULL) { 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList((xmlNodePtr) obj->user); 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */ 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) 541960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathFreeValueTree(obj->nodesetval); 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (obj->type == XPATH_LOCATIONSET) { 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->user != NULL) 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrFreeLocationSet(obj->user); 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (obj->type == XPATH_STRING) { 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->stringval != NULL) 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->stringval); 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(NULL, obj->type); 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 543660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFree(obj); 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathReleaseObject: 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlXPathObjectPtr to free or to cache 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Depending on the state of the cache this frees the given 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object or stores it in the cache. 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj) 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \ 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \ 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj; 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n)) 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->cache == NULL)) { 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 545960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (obj->type) { 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->boolval) { 546860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It looks like the @boolval is used for 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * evaluation if this an XSLT Result Tree Fragment. 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Check if this assumption is correct. 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->type = XPATH_XSLT_TREE; /* just for debugging */ 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeValueTree(obj->nodesetval); 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = NULL; 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((obj->nodesetval->nodeMax <= 40) && 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (XP_CACHE_WANTS(cache->nodesetObjs, 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxNodeset))) 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->nodesetObjs, obj); 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = NULL; 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->stringval != NULL) 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->stringval); 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) { 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->stringObjs, obj); 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) { 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->booleanObjs, obj); 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) { 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->numberObjs, obj); 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->user != NULL) { 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrFreeLocationSet(obj->user); 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto free_obj; 551560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto free_obj; 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to adding to the misc-objects slot. 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) { 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->miscObjs, obj); 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto free_obj; 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectobj_cached: 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(ctxt, obj->type); 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr tmpset = obj->nodesetval; 553660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Due to those nasty ns-nodes, we need to traverse 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the list and free the ns-nodes. 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Check if it's actually slowing things down. 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Maybe we shouldn't try to preserve the list. 5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmpset->nodeNr > 1) { 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < tmpset->nodeNr; i++) { 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = tmpset->nodeTab[i]; 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) node); 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (tmpset->nodeNr == 1) { 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmpset->nodeTab[0] != NULL) && 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL)) 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]); 555960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmpset->nodeNr = 0; 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(obj, 0, sizeof(xmlXPathObject)); 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = tmpset; 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(obj, 0, sizeof(xmlXPathObject)); 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfree_obj: 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cache is full; free the object. 557160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(NULL, obj->type); 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Casting Routines * 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToString: 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a boolean 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its string value. 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToString (int val) { 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val) 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "true"); 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "false"); 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToString: 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a number 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its string value. 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToString (double val) { 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (xmlXPathIsInf(val)) { 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 1: 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "Infinity"); 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case -1: 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "-Infinity"); 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val)) { 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "NaN"); 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (val == 0 && xmlXPathGetSign(val) != 0) { 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "0"); 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* could be improved */ 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buf[100]; 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFormatNumber(val, buf, 99); 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[99] = 0; 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) buf); 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToString: 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its string value. 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToString (xmlNodePtr node) { 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *ret; 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret = xmlNodeGetContent(node)) == NULL) 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) ""); 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToString: 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a node-set 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its string value. 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToString (xmlNodeSetPtr ns) { 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL)) 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrdup((const xmlChar *) "")); 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->nodeNr > 1) 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ns); 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCastNodeToString(ns->nodeTab[0])); 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToString: 5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent 5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the allocated string value of the object, NULL in case of error. 568260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * It's up to the caller to free the string memory with xmlFree(). 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToString(xmlXPathObjectPtr val) { 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrdup((const xmlChar *) "")); 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "String: undefined\n"); 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) ""); 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNodeSetToString(val->nodesetval); 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrdup(val->stringval)); 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastBooleanToString(val->boolval); 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: { 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNumberToString(val->floatval); 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) ""); 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertString: 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertString(xmlXPathObjectPtr val) { 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *res = NULL; 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewCString("")); 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNodeSetToString(val->nodesetval); 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastBooleanToString(val->boolval); 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNumberToString(val->floatval); 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(val); 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewCString("")); 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapString(res)); 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToNumber: 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a boolean 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its number value 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToNumber(int val) { 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val) 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1.0); 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0.0); 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToNumber: 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a string 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its number value 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToNumber(const xmlChar * val) { 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathStringEvalNumber(val)); 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToNumber: 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its number value 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToNumber (xmlNodePtr node) { 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *strval; 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strval = xmlXPathCastNodeToString(node); 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (strval == NULL) 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToNumber(strval); 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(strval); 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToNumber: 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a node-set 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its number value 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) { 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = xmlXPathCastNodeSetToString(ns); 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToNumber(str); 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToNumber: 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its number value 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToNumber(xmlXPathObjectPtr val) { 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret = 0.0; 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEGUB_EXPR 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n"); 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNAN; 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNodeSetToNumber(val->nodesetval); 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToNumber(val->stringval); 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = val->floatval; 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastBooleanToNumber(val->boolval); 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNAN; 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertNumber: 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertNumber(xmlXPathObjectPtr val) { 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewFloat(0.0)); 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_NUMBER) 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewFloat(xmlXPathCastToNumber(val)); 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(val); 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToBoolean: 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a number 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its boolean value 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToBoolean (double val) { 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val) || (val == 0.0)) 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToBoolean: 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a string 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its boolean value 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToBoolean (const xmlChar *val) { 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val == NULL) || (xmlStrlen(val) == 0)) 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToBoolean: 5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a node-set 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its boolean value 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) { 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->nodeNr == 0)) 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToBoolean: 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its boolean value 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToBoolean (xmlXPathObjectPtr val) { 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n"); 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNodeSetToBoolean(val->nodesetval); 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToBoolean(val->stringval); 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNumberToBoolean(val->floatval); 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = val->boolval; 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertBoolean: 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertBoolean(xmlXPathObjectPtr val) { 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewBoolean(0)); 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_BOOLEAN) 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val)); 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(val); 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle XPath contexts * 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewContext: 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathContext 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathContext just allocated. The caller will need to free it. 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextPtr 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewContext(xmlDocPtr doc) { 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr ret; 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext)); 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating context\n"); 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathContext)); 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = NULL; 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->varHash = NULL; 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nb_types = 0; 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max_types = 0; 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->types = NULL; 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->funcHash = xmlHashCreate(0); 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nb_axis = 0; 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max_axis = 0; 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->axis = NULL; 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nsHash = NULL; 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = NULL; 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->contextSize = -1; 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->proximityPosition = -1; 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEFAULT_CACHE_ON 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) { 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeContext(ret); 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 607360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathRegisterAllFunctions(ret); 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeContext: 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the context to free 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathContext 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeContext(xmlXPathContextPtr ctxt) { 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisteredNsCleanup(ctxt); 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisteredFuncsCleanup(ctxt); 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisteredVariablesCleanup(ctxt); 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&ctxt->lastError); 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle XPath parser contexts * 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT(ctxt) \ 610460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt == NULL) { \ 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, \ 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, \ 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__, \ 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, \ 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NULL context pointer\n"); \ 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); \ 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT_NEG(ctxt) \ 611560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt == NULL) { \ 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, \ 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, \ 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__, \ 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, \ 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NULL context pointer\n"); \ 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); \ 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CONTEXT(ctxt) \ 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->doc == NULL) || \ 612860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (ctxt->doc->children == NULL)) { \ 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \ 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); \ 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewParserContext: 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated. 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParserContextPtr 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) { 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr ret; 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "creating parser context\n"); 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->cur = ret->base = str; 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->context = ctxt; 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp = xmlXPathNewCompExpr(); 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->comp == NULL) { 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->valueTab); 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->dict != NULL)) { 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp->dict = ctxt->dict; 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(ret->comp->dict); 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompParserContext: 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the XPath compiled expression 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext when processing a compiled expression 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated. 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathParserContextPtr 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) { 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr ret; 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "creating evaluation context\n"); 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the value stack */ 619160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ret->valueTab = (xmlXPathObjectPtr *) 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->valueTab == NULL) { 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "creating evaluation context\n"); 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->valueNr = 0; 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->valueMax = 10; 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->value = NULL; 6201df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->valueFrame = 0; 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->context = ctxt; 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp = comp; 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeParserContext: 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the context to free 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathParserContext 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) { 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab != NULL) { 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->valueTab); 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp != NULL) { 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp->stream != NULL) { 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePatternList(ctxt->comp->stream); 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->stream = NULL; 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCompExpr(ctxt->comp); 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The implicit core function library * 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeValHash: 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node pointer 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node, 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeValHash(xmlNodePtr node) { 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 2; 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * string = NULL; 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp = NULL; 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int ret = 0; 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type == XML_DOCUMENT_NODE) { 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlDocGetRootElement((xmlDocPtr) node); 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->children; 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = tmp; 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (node->type) { 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = node->content; 6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string == NULL) 6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[0] == 0) 6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = ((xmlNsPtr)node)->href; 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string == NULL) 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[0] == 0) 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ((xmlAttrPtr) node)->children; 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = node->children; 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (tmp->type) { 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = tmp->content; 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = ((xmlNsPtr)tmp)->href; 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((string != NULL) && (string[0] != 0)) { 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len == 1) { 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret + (((unsigned int) string[0]) << 8)); 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[1] == 0) { 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned int) string[0]; 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to next node 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) { 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->children->type != XML_ENTITY_DECL) { 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->children; 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == node) 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->next != NULL) { 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 633960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == node) { 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->next != NULL) { 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringHash: 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: a string 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node, 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringHash(const xmlChar * string) { 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string == NULL) 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((unsigned int) 0); 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[0] == 0) 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetFloat: 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the node set 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the value 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a number 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns < @val (1, 1, ... 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns <= @val (1, 0, ... 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns > @val (0, 1, ... 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns >= @val (0, 0, ... 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number, 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in the 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set such that the result of performing the comparison on the number 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be compared and on the result of converting the string-value of that 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node to a number using the number function is true. 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict, 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, xmlXPathObjectPtr f) { 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret = 0; 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f == NULL) || (arg == NULL) || 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, f); 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns->nodeNr;i++) { 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) { 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, str2)); 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f)); 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareValues(ctxt, inf, strict); 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, f); 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetString: 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the node set 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @s: the value 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a string 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns < @val (1, 1, ... 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns <= @val (1, 0, ... 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns > @val (0, 1, ... 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns >= @val (0, 0, ... 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string, 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true. 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict, 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, xmlXPathObjectPtr s) { 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret = 0; 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((s == NULL) || (arg == NULL) || 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, s); 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns->nodeNr;i++) { 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) { 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, str2)); 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s)); 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareValues(ctxt, inf, strict); 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, s); 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSets: 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first node set object 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second node set object 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation on nodesets: 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a node in the second node-set such that the result of performing 649860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * the comparison on the string-values of the two nodes is true. 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * .... 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is <=, <, >= or >, then the objects are compared by converting both 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * objects to numbers and comparing the numbers according to IEEE 754. 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * .... 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The number function converts its argument to a number as follows: 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a string that consists of optional whitespace followed by an 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * optional minus sign followed by a Number followed by whitespace 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is converted to the IEEE 754 number that is nearest (according 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the IEEE 754 round-to-nearest rule) to the mathematical value 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * represented by the string; any other string is converted to NaN 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Conclusion all nodes need to be converted first to their string value 651260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * and then the comparison must be done when possible 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSets(int inf, int strict, 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, init = 0; 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val1; 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double *values2; 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns1; 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns2; 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) { 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2 == NULL) || 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) { 6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns1 = arg1->nodesetval; 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns2 = arg2->nodesetval; 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns1 == NULL) || (ns1->nodeNr <= 0)) { 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns2 == NULL) || (ns2->nodeNr <= 0)) { 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double)); 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2 == NULL) { 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) { 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]); 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val1)) 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) { 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (init == 0) { 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]); 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(values2[j])) 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 656760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (inf && strict) 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 < values2[j]); 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (inf && !strict) 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 <= values2[j]); 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && strict) 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 > values2[j]); 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && !strict) 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 >= values2[j]); 6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project init = 1; 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2); 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetValue: 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the node set 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the value 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a value 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns < @val (1, 1, ... 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns <= @val (1, 0, ... 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns > @val (0, 1, ... 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns >= @val (0, 0, ... 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a boolean, 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if the result of performing 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison on the boolean and on the result of converting 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set to a boolean using the boolean function is true. 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict, 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, xmlXPathObjectPtr val) { 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val == NULL) || (arg == NULL) || 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(val->type) { 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val)); 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareNodeSets(inf, strict, arg, val)); 6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val)); 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg); 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, val); 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareValues(ctxt, inf, strict)); 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetString: 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the nodeset object argument 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string to compare to. 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq: flag to show whether for '=' (0) or '!=' (1) 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string, 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true. 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq) 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int hash; 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((str == NULL) || (arg == NULL) || 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A NULL nodeset compared with a string is always false 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (since there is no node equal, and no node not equal) 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->nodeNr <= 0) ) 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hash = xmlXPathStringHash(str); 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ns->nodeNr; i++) { 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) { 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlNodeGetContent(ns->nodeTab[i]); 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((str2 != NULL) && (xmlStrEqual(str, str2))) { 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) { 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (neq) { 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (neq) 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetFloat: 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the nodeset object argument 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the float to compare to 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq: flag to show whether to compare '=' (0) or '!=' (1) 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number, 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number to be compared and on the result of converting the string-value 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of that node to a number using the number function is true. 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt, 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, double f, int neq) { 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret=0; 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val; 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double v; 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg == NULL) || 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i=0;i<ns->nodeNr;i++) { 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) { 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = valuePop(ctxt); 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project v = val->floatval; 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, val); 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathIsNaN(v)) { 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!neq) && (v==f)) { 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((neq) && (v!=f)) { 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { /* NaN is unequal to any value */ 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSets: 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: first nodeset object argument 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: second nodeset object argument 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq: flag to show whether to test '=' (0) or '!=' (1) 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal / not equal operation on XPath nodesets: 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 == @arg2 or @arg1 != @arg2 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set and 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a node in the second node-set such that the result of performing the 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison on the string-values of the two nodes is true. 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (needless to say, this is a costly operation) 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) { 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int *hashs1; 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int *hashs2; 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values1; 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values2; 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns1; 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns2; 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2 == NULL) || 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns1 = arg1->nodesetval; 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns2 = arg2->nodesetval; 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns1 == NULL) || (ns1->nodeNr <= 0)) 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns2 == NULL) || (ns2->nodeNr <= 0)) 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for equal, check if there is a node pertaining to both sets 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq == 0) 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns1->nodeTab[i] == ns2->nodeTab[j]) 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *)); 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values1 == NULL) { 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int)); 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hashs1 == NULL) { 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *)); 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *)); 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2 == NULL) { 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs1); 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int)); 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hashs2 == NULL) { 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs1); 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2); 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *)); 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) { 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]); 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) { 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i == 0) 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]); 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hashs1[i] != hashs2[j]) { 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) { 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values1[i] == NULL) 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values1[i] = xmlNodeGetContent(ns1->nodeTab[i]); 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2[j] == NULL) 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2[j] = xmlNodeGetContent(ns2->nodeTab[j]); 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(values1[i], values2[j]) ^ neq; 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values1[i] != NULL) 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1[i]); 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2[j] != NULL) 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2[j]); 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2); 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs1); 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs2); 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt, 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *At this point we are assured neither arg1 nor arg2 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *is a nodeset, so we can just pick the appropriate routine. 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg1->type) { 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: %d boolean %d \n", 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->boolval, arg2->boolval); 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->boolval == arg2->boolval); 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->boolval == 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNumberToBoolean(arg2->floatval)); 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->stringval == NULL) || 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2->stringval[0] == 0)) ret = 0; 690760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->boolval == ret); 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg2->boolval== 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNumberToBoolean(arg1->floatval)); 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg2); 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hand check NaN and Infinity equalities */ 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(arg1->floatval) || 694260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathIsNaN(arg2->floatval)) { 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == 1) { 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == 1) 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == -1) { 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == -1) 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == 1) { 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == 1) 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == -1) { 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == -1) 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval == arg2->floatval); 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->stringval == NULL) || 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->stringval[0] == 0)) ret = 0; 699060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg2->boolval == ret); 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(arg1->stringval, arg2->stringval); 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hand check NaN and Infinity equalities */ 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(arg1->floatval) || 700360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathIsNaN(arg2->floatval)) { 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == 1) { 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == 1) 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == -1) { 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == -1) 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == 1) { 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == 1) 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == -1) { 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == -1) 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval == arg2->floatval); 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualValues: 7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValues(xmlXPathParserContextPtr ctxt) { 7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2, argtmp; 7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); 706960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott arg2 = valuePop(ctxt); 7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || (arg2 == NULL)) { 7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 != NULL) 7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 == arg2) { 7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: by pointer\n"); 7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *If either argument is a nodeset, it's a 'special case' 7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || 7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *Hack it to assure arg1 is the nodeset 7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { 7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project argtmp = arg2; 7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = arg1; 7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = argtmp; 7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSets(arg1, arg2, 0); 7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->nodesetval == NULL) || 7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->nodesetval->nodeNr == 0)) ret = 0; 711560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (ret == arg2->boolval); 7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0); 7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0); 7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); 7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotEqualValues: 7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) { 7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2, argtmp; 7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); 715460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott arg2 = valuePop(ctxt); 7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || (arg2 == NULL)) { 7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 != NULL) 7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 == arg2) { 7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NotEqual: by pointer\n"); 7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *If either argument is a nodeset, it's a 'special case' 7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || 7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *Hack it to assure arg1 is the nodeset 7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { 7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project argtmp = arg2; 7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = arg1; 7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = argtmp; 7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NotEqual: undefined\n"); 7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSets(arg1, arg2, 1); 7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->nodesetval == NULL) || 7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->nodesetval->nodeNr == 0)) ret = 0; 720060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (ret != arg2->boolval); 7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1); 7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1); 7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); 7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareValues: 7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 723160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Implement the compare operation on XPath objects: 7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 < @arg2 (1, 1, ... 7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 <= @arg2 (1, 0, ... 7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 > @arg2 (0, 1, ... 7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 >= @arg2 (0, 0, ... 7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator is 7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <=, <, >=, >, then the objects are compared by converted both objects 7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to numbers and comparing the numbers according to IEEE 754. The < 7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison will be true if and only if the first number is less than the 7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * second number. The <= comparison will be true if and only if the first 7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number is less than or equal to the second number. The > comparison 7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if the first number is greater than the second 7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number. The >= comparison will be true if and only if the first number 7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is greater than or equal to the second number. 7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison succeeded, 0 if it failed 7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) { 7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, arg1i = 0, arg2i = 0; 7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); 725560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott arg2 = valuePop(ctxt); 7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || (arg2 == NULL)) { 7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 != NULL) 7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || 7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments 7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are not freed from within this routine; they will be freed from the 7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue 7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) && 7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){ 7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2); 7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict, 7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1, arg2); 7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict, 7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2, arg1); 7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1->type != XPATH_NUMBER) { 7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1->type != XPATH_NUMBER) { 7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2->type != XPATH_NUMBER) { 7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg2); 7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2->type != XPATH_NUMBER) { 7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add tests for infinity and nan 7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * => feedback on 3.4 for Inf and NaN 7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hand check NaN and Infinity comparisons */ 7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { 7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret=0; 7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1i=xmlXPathIsInf(arg1->floatval); 7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2i=xmlXPathIsInf(arg2->floatval); 7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inf && strict) { 7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1i == -1 && arg2i != -1) || 7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2i == 1 && arg1i != 1)) { 7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval < arg2->floatval); 7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (inf && !strict) { 7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1i == -1 || arg2i == 1) { 7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval <= arg2->floatval); 7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && strict) { 7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1i == 1 && arg2i != 1) || 7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2i == -1 && arg1i != -1)) { 7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval > arg2->floatval); 7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && !strict) { 7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1i == 1 || arg2i == -1) { 7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval >= arg2->floatval); 7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathValueFlipSign: 7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the unary - operation on an XPath object 7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) { 7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return; 7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(ctxt->value->floatval)) 7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval=xmlXPathNAN; 7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlXPathIsInf(ctxt->value->floatval) == 1) 7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval=xmlXPathNINF; 7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlXPathIsInf(ctxt->value->floatval) == -1) 7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval=xmlXPathPINF; 7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval == 0) { 7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathGetSign(ctxt->value->floatval) == 0) 7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNZERO; 7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = 0; 7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = - ctxt->value->floatval; 7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathAddValues: 7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the add operation on XPath objects: 7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathAddValues(xmlXPathParserContextPtr ctxt) { 7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval += val; 7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubValues: 7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the subtraction operation on XPath objects: 7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubValues(xmlXPathParserContextPtr ctxt) { 7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval -= val; 7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathMultValues: 7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the multiply operation on XPath objects: 7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathMultValues(xmlXPathParserContextPtr ctxt) { 7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval *= val; 7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDivValues: 7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the div operation on XPath objects @arg1 / @arg2: 7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDivValues(xmlXPathParserContextPtr ctxt) { 7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval)) 7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val == 0 && xmlXPathGetSign(val) != 0) { 7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval == 0) 7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval > 0) 7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNINF; 7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval < 0) 7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathPINF; 7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val == 0) { 7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval == 0) 7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval > 0) 7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathPINF; 7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval < 0) 7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNINF; 749660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else 7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval /= val; 7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathModValues: 7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the mod operation on XPath objects: @arg1 / @arg2 7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathModValues(xmlXPathParserContextPtr ctxt) { 7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double arg1, arg2; 7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = xmlXPathCastToNumber(arg); 7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = ctxt->value->floatval; 7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2 == 0) 7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = fmod(arg1, arg2); 7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The traversal functions * 7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis. 7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates 7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL. 7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunction) 7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathParserContextPtr ctxt, xmlNodePtr cur); 7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTraversalFunctionExt: 7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis. 7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates 7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL. 7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The context node of the traversal is specified via @contextNode. 7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunctionExt) 7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr cur, xmlNodePtr contextNode); 7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeFunction: 7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used for merging node sets in xmlXPathCollectAndTest(). 7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction) 7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodeSetPtr, xmlNodeSetPtr, int); 7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextSelf: 7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "self" direction 7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The self axis contains just the context node itself 7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node); 7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChild: 7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction 7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order. 7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) return(NULL); 7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->context->node->type) { 7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->children); 7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((xmlDocPtr) ctxt->context->node)->children); 7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_DOCUMENT_NODE) || 7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_HTML_DOCUMENT_NODE)) 7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChildElement: 7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction and nodes of type element. 7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order. 7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->context->node; 7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL); 7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the first element child. 7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */ 7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) 7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((cur != NULL) && 7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_ELEMENT_NODE)); 7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDocGetRootElement((xmlDocPtr) cur)); 7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the next sibling element node. 7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */ 7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next->type == XML_ELEMENT_NODE) 7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE)); 7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelfElemParent: 7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" axis. 7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Additionally it returns only nodes which can be parents of 7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element nodes. 7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur, 7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr contextNode) 7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode == NULL) 7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (contextNode->type) { 7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 773160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_HTML_DOCUMENT_NODE: 7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(contextNode); 7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 773460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr start = cur; 7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: OK to have XInclude here? */ 7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 774560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_DOCUMENT_FRAG_NODE: 7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != start) 7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Not sure if we need those here. */ 7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != start) 7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDocGetRootElement((xmlDocPtr) cur)); 7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 776460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 776560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sibling: 7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur == contextNode)) 776860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 777060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur = cur->next; 7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_sibling; 7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 777860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendant: 7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant" direction 7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant axis contains the descendants of the context node in document 7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order; a descendant is a child or a child of a child and so on. 7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) 7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) 7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->doc->children); 7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->children); 7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do not descend on entities declarations 7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 781060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (cur->children->type != XML_ENTITY_DECL) { 7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip DTDs 7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_DTD_NODE) 7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->node) return(NULL); 7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 782860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) break; 7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->node) return(NULL); 7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelf: 7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" direction 7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant-or-self axis contains the context node and the descendants 7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node in document order; thus the context node is the first 7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis, and the first child of the context node is the second node 7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the axis 7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) 7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node); 7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNextDescendant(ctxt, cur)); 7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextParent: 7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "parent" direction 7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parent axis contains the parent of the context node, if there is one. 7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parent of an attribute or namespace node is the element 7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to which the attribute or namespace node is attached 7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace handling !!! 7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) return(NULL); 7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->context->node->type) { 7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->parent == NULL) 7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ctxt->context->doc); 7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && 7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->context->node->parent->name[0] == ' ') || 7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->context->node->parent->name, 7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "fake node libxslt")))) 7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->parent); 7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: { 7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; 7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(att->parent); 7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: { 7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; 792760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && 7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->next->type != XML_NAMESPACE_DECL)) 7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns->next); 7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestor: 7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor" direction 7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the ancestor axis contains the ancestors of the context node; the ancestors 7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node consist of the parent of context node and the parent's 7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent and so on; the nodes are ordered in reverse document order; thus the 7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent is the first node on the axis, and the parent's parent is the second 7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis 7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parent of an attribute or namespace node is the element 7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to which the attribute or namespace node is attached 7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * !!!!!!!!!!!!! 7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) return(NULL); 7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->context->node->type) { 7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->parent == NULL) 7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ctxt->context->doc); 7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && 7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->context->node->parent->name[0] == ' ') || 7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->context->node->parent->name, 7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "fake node libxslt")))) 7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->parent); 7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: { 7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node; 7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp->parent); 7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: { 7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; 800060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && 8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->next->type != XML_NAMESPACE_DECL)) 8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns->next); 8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Bad, how did that namespace end up here ? */ 8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->doc->children) 8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ctxt->context->doc); 8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) 8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->parent == NULL) 8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent->type == XML_ELEMENT_NODE) && 8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->parent->name[0] == ' ') || 8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->parent->name, 8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "fake node libxslt")))) 8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->parent); 8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: { 8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; 8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(att->parent); 8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: { 8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; 804460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && 8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->next->type != XML_NAMESPACE_DECL)) 8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns->next); 8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Bad, how did that namespace end up here ? */ 8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestorOrSelf: 8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor-or-self" direction 8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * he ancestor-or-self axis contains the context node and ancestors of 8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node in reverse document order; thus the context node is 8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node on the axis, and the context node's parent the second; 8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent here is defined the same as with the parent axis. 8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node); 8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNextAncestor(ctxt, cur)); 8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowingSibling: 8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following-sibling" direction 8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following-sibling axis contains the following siblings of the context 8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in document order. 8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) 8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->next); 8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingSibling: 8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding-sibling" direction 8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The preceding-sibling axis contains the preceding siblings of the context 8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in reverse document order; the first preceding sibling is first on the 8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * axis; the sibling preceding that node is the second on the axis and so on. 8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) 8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->prev); 8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) { 8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->prev); 8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->prev); 8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowing: 8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following" direction 8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following axis contains all nodes in the same document as the context 8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are after the context node in document order, excluding any 8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * descendants and excluding attribute nodes and namespace nodes; the nodes 8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are ordered in document order 8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8154df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((cur != NULL) && (cur->type != XML_ATTRIBUTE_NODE) && 8155df143a5041f03a22808b59c76698770b74692815Selim Gurun (cur->type != XML_NAMESPACE_DECL) && (cur->children != NULL)) 8156df143a5041f03a22808b59c76698770b74692815Selim Gurun return(cur->children); 8157df143a5041f03a22808b59c76698770b74692815Selim Gurun 8158df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) { 8159df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->context->node; 8160df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_NAMESPACE_DECL) 8161df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 8162df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_ATTRIBUTE_NODE) 8163df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->parent; 8164df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL) ; /* ERROR */ 8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) return(cur->next) ; 8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) break; 8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); 8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) return(cur->next); 8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAncestor: 8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ancestor: the ancestor node 8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current node 8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that @ancestor is a @node's ancestor 8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if @ancestor is a @node's ancestor, 0 otherwise. 8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) { 8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ancestor == NULL) || (node == NULL)) return(0); 8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* nodes need to be in the same document */ 8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ancestor->doc != node->doc) return(0); 8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* avoid searching if ancestor or node is the root node */ 8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ancestor == (xmlNodePtr) node->doc) return(1); 8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == (xmlNodePtr) ancestor->doc) return(0); 8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node->parent != NULL) { 8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->parent == ancestor) 8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPreceding: 8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction 8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context 8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any 8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are 8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order 8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) 8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8218df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) { 8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->context->node; 8220df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_NAMESPACE_DECL) 8221df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 8222df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_ATTRIBUTE_NODE) 8223df143a5041f03a22808b59c76698770b74692815Selim Gurun return(cur->parent); 8224df143a5041f03a22808b59c76698770b74692815Selim Gurun } 8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) 8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->prev != NULL) { 8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cur = cur->prev; cur->last != NULL; cur = cur->last) ; 8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->doc->children) 8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (xmlXPathIsAncestor(cur, ctxt->context->node)); 8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingInternal: 8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction 8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context 8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any 8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are 8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order 825460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * This is a faster implementation but internal only since it requires a 8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state kept in the parser context: ctxt->ancestor. 8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt, 8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur) 8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->context->node; 8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8268df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->type == XML_NAMESPACE_DECL) 8269df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->ancestor = cur->parent; 8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) 8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->prev == NULL) { 8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->doc->children) 8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != ctxt->ancestor) 8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->ancestor = cur->parent; 8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->last != NULL) 8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->last; 8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextNamespace: 8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current attribute in the traversal 8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "namespace" direction 8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace axis contains the namespace nodes of the context node; 8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the order of nodes on this axis is implementation-defined; the axis will 8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be empty unless the context node is an element 8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We keep the XML namespace node at the end of the list. 8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL); 8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) { 8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList != NULL) 8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->context->tmpNsList); 831160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->context->tmpNsList = 8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGetNsList(ctxt->context->doc, ctxt->context->node); 8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsNr = 0; 8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList != NULL) { 8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) { 8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsNr++; 8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) xmlXPathXMLNamespace); 8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsNr > 0) { 8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr]; 8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList != NULL) 8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->context->tmpNsList); 8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsList = NULL; 8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAttribute: 8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current attribute in the traversal 8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "attribute" direction 8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: support DTD inherited default attributes 8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) 8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->type != XML_ELEMENT_NODE) 8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) 8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr)ctxt->context->node->properties); 8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr)cur->next); 8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NodeTest Functions * 8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_FUNCTION 200 8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implicit tree core function library * 8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoot: 8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the context to the root of the document 8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoot(xmlXPathParserContextPtr ctxt) { 8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) 8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = (xmlNodePtr) ctxt->context->doc; 8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The explicit core function library * 8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib * 8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLastFunction: 8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the last() XPath function 8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number last() 8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The last function returns the number of nodes in the context node list. 8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->contextSize >= 0) { 8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewFloat(ctxt->context, 8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (double) ctxt->context->contextSize)); 8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "last() : %d\n", ctxt->context->contextSize); 8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_CTXT_SIZE); 8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPositionFunction: 8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the position() XPath function 8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number position() 8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The position function returns the position of the context node in the 8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node list. The first position is 1, and so the last position 8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be equal to last(). 8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->proximityPosition >= 0) { 8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewFloat(ctxt->context, 8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (double) ctxt->context->proximityPosition)); 8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "position() : %d\n", 8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition); 8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_CTXT_POSITION); 8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCountFunction: 8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the count() XPath function 8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number count(node-set) 8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 845960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->value == NULL) || 8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur->nodesetval == NULL)) 8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); 8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) { 8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (double) cur->nodesetval->nodeNr)); 8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval->nodeNr != 1) || 8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodesetval->nodeTab == NULL)) { 8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); 8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; 8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->nodesetval->nodeTab[0]; 8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->children; 8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i)); 8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetElementsByIds: 8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ids: a whitespace separated list of IDs 8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Selects elements by their unique ID. 8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node-set of selected elements. 8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) { 8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = ids; 8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ID; 8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem = NULL; 8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ids == NULL) return(NULL); 8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 851260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 851360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((!IS_BLANK_CH(*cur)) && (*cur != 0)) 8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ID = xmlStrndup(ids, cur - ids); 8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ID != NULL) { 8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We used to check the fact that the value passed 8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * was an NCName, but this generated much troubles for 8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * me and Aleksey Sanin, people blatantly violated that 8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * constaint, like Visa3D spec. 8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if (xmlValidateNCName(ID, 1) == 0) 8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = xmlGetID(doc, ID); 8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr != NULL) { 8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->type == XML_ATTRIBUTE_NODE) 8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = attr->parent; 8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (attr->type == XML_ELEMENT_NODE) 8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = (xmlNodePtr) attr; 8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = NULL; 8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem != NULL) 8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAdd(ret, elem); 8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ID); 8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ids = cur; 8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIdFunction: 8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the id() XPath function 8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set id(object) 8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The id function selects elements by their unique ID 8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, 8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the result is the union of the result of applying id to the 8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string value of each of the nodes in the argument node-set. When the 8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument to id is of any other type, the argument is converted to a 8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string as if by a call to the string function; the string is split 8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into a whitespace-separated list of tokens (whitespace is any sequence 8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of characters matching the production S); the result is a node-set 8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * containing the elements in the same document as the context node that 8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have a unique ID equal to any of the tokens in the list. 8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tokens; 8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND); 8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { 8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 858160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 858260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * FIXME -- in an out-of-memory condition this will behave badly. 858360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * The solution is not clear -- we already popped an item from 858460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * ctxt, so the object is in a corrupt state. 858560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < obj->nodesetval->nodeNr; i++) { 8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tokens = 8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]); 8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens); 8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetMerge(ret, ns); 8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(ns); 8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tokens != NULL) 8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(tokens); 8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); 8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = xmlXPathCacheConvertString(ctxt->context, obj); 8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval); 860460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); 8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLocalNameFunction: 8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the local-name() XPath function 8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string local-name(node-set?) 8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The local-name function returns a string containing the local part 8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the name of the node in the argument node-set that is first in 8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document order. If the node-set is empty or the first node has no 8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * name, an empty string is returned. If the argument is omitted it 8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node. 8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 863560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->value == NULL) || 8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { 8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; /* Should be first in document order !!!!! */ 8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->nodesetval->nodeTab[i]->type) { 8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodesetval->nodeTab[i]->name[0] == ' ') 8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, 8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->name)); 8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix)); 8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNamespaceURIFunction: 8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the namespace-uri() XPath function 8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string namespace-uri(node-set?) 8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The namespace-uri function returns a string containing the 8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace URI of the expanded name of the node in the argument 8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set that is first in document order. If the node-set is empty, 8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node has no name, or the expanded name has no namespace 8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URI, an empty string is returned. If the argument is omitted it 8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node. 8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 869360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->value == NULL) || 8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { 8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; /* Should be first in document order !!!!! */ 8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->nodesetval->nodeTab[i]->type) { 8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodesetval->nodeTab[i]->ns == NULL) 8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->ns->href)); 8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNameFunction: 8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the name() XPath function 8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string name(node-set?) 8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The name function returns a string containing a QName representing 8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the name of the node in the argument node-set that is first in document 8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order. The QName must represent the name with respect to the namespace 8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declarations in effect on the node whose name is being represented. 8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Typically, this will be the form in which the name occurred in the XML 8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * source. This need not be the case if there are namespace declarations 8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in effect on the node that associate multiple prefixes with the same 8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace. However, an implementation may include information about 8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the original prefix in its representation of nodes; in this case, an 8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation can ensure that the returned string is always the same 8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as the QName used in the XML source. If the argument it omitted it 8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node. 8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Libxml keep the original prefix so the "real qualified name" used is 8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned. 8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs) 8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || 8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { 8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; /* Should be first in document order !!!!! */ 8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->nodesetval->nodeTab[i]->type) { 8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodesetval->nodeTab[i]->name[0] == ' ') 8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewCString(ctxt->context, "")); 8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((cur->nodesetval->nodeTab[i]->ns == NULL) || 8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) { 8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, 8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->name)); 8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 877760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name, 8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->ns->prefix, 8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0); 8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == cur->nodesetval->nodeTab[i]->name) 8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name); 8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) { 8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_MEMORY_ERROR); 8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapString( 8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context, fullname)); 8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i])); 8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLocalNameFunction(ctxt, 1); 8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringFunction: 8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string() XPath function 8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string string(object?) 8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string function converts an object to a string as follows: 8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - A node-set is converted to a string by returning the value of 8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node in the node-set that is first in document order. 8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the node-set is empty, an empty string is returned. 8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - A number is converted to a string as follows 881260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * + NaN is converted to the string NaN 881360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * + positive zero is converted to the string 0 881460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * + negative zero is converted to the string 0 881560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * + positive infinity is converted to the string Infinity 881660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * + negative infinity is converted to the string -Infinity 8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + if the number is an integer, the number is represented in 8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decimal form as a Number with no decimal point and no leading 8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * zeros, preceded by a minus sign (-) if the number is negative 8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + otherwise, the number is represented in decimal form as a 8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Number including a decimal point with at least one digit 8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before the decimal point and at least one digit after the 8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decimal point, preceded by a minus sign (-) if the number 8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is negative; there must be no leading zeros before the decimal 8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * point apart possibly from the one required digit immediately 8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before the decimal point; beyond the one required digit 8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * after the decimal point there must be as many, but only as 8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * many, more digits as are needed to uniquely distinguish the 8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number from all other IEEE 754 numeric values. 8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The boolean false value is converted to the string false. 8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The boolean true value is converted to the string true. 8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the argument is omitted, it defaults to a node-set with the 8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node as its only member. 8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheWrapString(ctxt->context, 8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNodeToString(ctxt->context->node))); 8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); 8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur)); 8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringLengthFunction: 8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string-length() XPath function 8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number string-length(string?) 8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string-length returns the number of characters in the string 8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [3.6 Strings]). If the argument is omitted, it defaults to 8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node converted to a string, in other words the value 8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node. 8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) 8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) { 8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0)); 8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content; 8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlXPathCastNodeToString(ctxt->context->node); 8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUTF8Strlen(content))); 8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 889060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlUTF8Strlen(cur->stringval))); 8891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConcatFunction: 8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the concat() XPath function 8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string concat(string, string, string*) 8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The concat function returns the concatenation of its arguments. 8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur, newobj; 8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp; 8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs < 2) { 8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur->type != XPATH_STRING)) { 8916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs--; 8920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (nargs > 0) { 8922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newobj = valuePop(ctxt); 8924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((newobj == NULL) || (newobj->type != XPATH_STRING)) { 8925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, newobj); 8926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlStrcat(newobj->stringval, cur->stringval); 8930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newobj->stringval = cur->stringval; 8931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->stringval = tmp; 8932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, newobj); 8933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs--; 8934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, cur); 8936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContainsFunction: 8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the contains() XPath function 8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean contains(string, string) 8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contains function returns true if the first argument string 8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * contains the second argument string, and otherwise returns false. 8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr hay, needle; 8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project needle = valuePop(ctxt); 8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hay = valuePop(ctxt); 8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((hay == NULL) || (hay->type != XPATH_STRING)) { 8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrstr(hay->stringval, needle->stringval)) 8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); 8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); 8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStartsWithFunction: 8974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the starts-with() XPath function 8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean starts-with(string, string) 8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The starts-with function returns true if the first argument string 8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starts with the second argument string, and otherwise returns false. 8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr hay, needle; 8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int n; 8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project needle = valuePop(ctxt); 8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hay = valuePop(ctxt); 8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((hay == NULL) || (hay->type != XPATH_STRING)) { 8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n = xmlStrlen(needle->stringval); 9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrncmp(hay->stringval, needle->stringval, n)) 9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); 9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); 9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringFunction: 9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring() XPath function 9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string substring(string, number, number?) 9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring function returns the substring of the first argument 9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starting at the position specified in the second argument with 9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * length specified in the third argument. For example, 9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substring("12345",2,3) returns "234". If the third argument is not 9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specified, it returns the substring starting at the position specified 9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the second argument and continuing to the end of the string. For 9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * example, substring("12345",2) returns "2345". More precisely, each 9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string (see [3.6 Strings]) is considered to have a 9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * numeric position: the position of the first character is 1, the position 9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the second character is 2 and so on. The returned substring contains 9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * those characters for which the position of the character is greater than 9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or equal to the second argument and, if the third argument is specified, 9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * less than the sum of the second and third arguments; the comparisons 9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and addition used for the above follow the standard IEEE 754 rules. Thus: 902960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - substring("12345", 1.5, 2.6) returns "234" 903060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - substring("12345", 0, 3) returns "12" 903160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - substring("12345", 0 div 0, 3) returns "" 903260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - substring("12345", 1, 0 div 0) returns "" 903360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - substring("12345", -42, 1 div 0) returns "12345" 903460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - substring("12345", -1 div 0, 1 div 0) returns "" 9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str, start, len; 9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double le=0, in; 9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l, m; 9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs < 2) { 9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs > 3) { 9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(3); 9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * take care of possible last (position) argument 9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 3) { 9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = valuePop(ctxt); 9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project le = len->floatval; 9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, len); 9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = valuePop(ctxt); 9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = start->floatval; 9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, start); 9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project m = xmlUTF8Strlen((const unsigned char *)str->stringval); 9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If last pos not present, calculate last position 9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs != 3) { 9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project le = (double)m; 907560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (in < 1.0) 9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = 1.0; 9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 907960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* Need to check for the special cases where either 9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the index is NaN, the length is NaN, or both 9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * arguments are infinity (relying on Inf + -Inf = NaN) 9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9083df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!xmlXPathIsInf(in) && !xmlXPathIsNaN(in + le)) { 9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * To meet the requirements of the spec, the arguments 908660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * must be converted to integer format before 9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * initial index calculations are done 9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First we go to integer form, rounding up 9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and checking for special cases 9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = (int) in; 9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((double)i)+0.5 <= in) i++; 9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(le) == 1) { 9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = m; 9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i < 1) 9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 1; 9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlXPathIsInf(le) == -1 || le < 0.0) 9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = 0; 9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = (int) le; 9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((double)l)+0.5 <= le) l++; 9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Now we normalize inidices */ 9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i -= 1; 9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l += i; 9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i < 0) 9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l > m) 9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = m; 9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* number of chars to copy */ 9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l -= i; 9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUTF8Strsub(str->stringval, i, l); 9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret)); 9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringBeforeFunction: 9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-before() XPath function 9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string substring-before(string, string) 9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-before function returns the substring of the first 9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that precedes the first occurrence of the second 9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty string 9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument 9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-before("1999/04/01","/") returns 1999. 9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr find; 9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *point; 9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int offset; 915260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project find = valuePop(ctxt); 9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 915860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project point = xmlStrstr(str->stringval, find->stringval); 9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (point) { 9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project offset = (int)(point - str->stringval); 9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, str->stringval, offset); 9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, find); 9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringAfterFunction: 9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-after() XPath function 9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string substring-after(string, string) 9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-after function returns the substring of the first 9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that follows the first occurrence of the second 9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty stringi 9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument 9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-after("1999/04/01","/") returns 04/01, 9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and substring-after("1999/04/01","19") returns 99/04/01. 9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr find; 9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *point; 9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int offset; 919560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project find = valuePop(ctxt); 9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 920160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project point = xmlStrstr(str->stringval, find->stringval); 9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (point) { 9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project offset = (int)(point - str->stringval) + xmlStrlen(find->stringval); 9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, &str->stringval[offset], 9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrlen(str->stringval) - offset); 9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 921160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlBufferContent(target))); 9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, find); 9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNormalizeFunction: 9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the normalize-space() XPath function 9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string normalize-space(string?) 9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The normalize-space function returns the argument string with white 9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space normalized by stripping leading and trailing whitespace 9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and replacing sequences of whitespace characters by a single 9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space. Whitespace characters are the same allowed by the S production 9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in XML. If the argument is omitted, it defaults to the context 9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node converted to a string, in other words the value of the context node. 9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj = NULL; 9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *source = NULL; 9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar blank; 923860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use current context node */ 9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheWrapString(ctxt->context, 9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNodeToString(ctxt->context->node))); 9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project source = obj->stringval; 9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target && source) { 925660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Skip leading whitespaces */ 9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*source)) 9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project source++; 926060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Collapse intermediate whitespaces, and skip trailing whitespaces */ 9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blank = 0; 9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*source) { 9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(*source)) { 9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blank = 0x20; 9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (blank) { 9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, &blank, 1); 9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blank = 0; 9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, source, 1); 9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project source++; 9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTranslateFunction: 9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the translate() XPath function 9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string translate(string, string, string) 9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The translate function returns the first argument string with 9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurrences of characters in the second argument string replaced 9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the character at the corresponding position in the third argument 9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, translate("bar","abc","ABC") returns the string 9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BAr. If there is a character in the second argument string with no 9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character at a corresponding position in the third argument string 9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (because the second argument string is longer than the third argument 9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string), then occurrences of that character in the first argument 9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string are removed. For example, translate("--aaa--","abc-","ABC") 9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "AAA". If a character occurs more than once in second 9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then the first occurrence determines the replacement 9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character. If the third argument string is longer than the second 9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then excess characters are ignored. 9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr from; 9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr to; 9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int offset, max; 9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar ch; 9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *point; 9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cptr; 9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(3); 9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = valuePop(ctxt); 9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from = valuePop(ctxt); 9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = xmlUTF8Strlen(to->stringval); 9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cptr = str->stringval; (ch=*cptr); ) { 9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project offset = xmlUTF8Strloc(from->stringval, cptr); 9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (offset >= 0) { 9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (offset < max) { 9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project point = xmlUTF8Strpos(to->stringval, offset); 9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (point) 9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, point, xmlUTF8Strsize(point, 1)); 9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, cptr, xmlUTF8Strsize(cptr, 1)); 9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Step to next character in input */ 9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cptr++; 9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ch & 0x80 ) { 9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if not simple ascii, verify proper format */ 9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( (ch & 0xc0) != 0xc0 ) { 9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathTranslateFunction: Invalid UTF8 string\n"); 9344df143a5041f03a22808b59c76698770b74692815Selim Gurun /* not asserting an XPath error is probably better */ 9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* then skip over remaining bytes for this char */ 9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ( (ch <<= 1) & 0x80 ) 9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( (*cptr++ & 0xc0) != 0x80 ) { 9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathTranslateFunction: Invalid UTF8 string\n"); 9352df143a5041f03a22808b59c76698770b74692815Selim Gurun /* not asserting an XPath error is probably better */ 9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ch & 0x80) /* must have had error encountered */ 9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, from); 9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, to); 9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathBooleanFunction: 9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the boolean() XPath function 9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean boolean(object) 9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The boolean function converts its argument to a boolean as follows: 9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a number is true if and only if it is neither positive or 9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * negative zero nor NaN 9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a node-set is true if and only if it is non-empty 9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a string is true if and only if its length is non-zero 9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); 9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathCacheConvertBoolean(ctxt->context, cur); 9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, cur); 9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotFunction: 9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the not() XPath function 9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean not(boolean) 9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The not function returns true if its argument is false, 9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and false otherwise. 9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_BOOLEAN; 9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_BOOLEAN); 9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->boolval = ! ctxt->value->boolval; 9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrueFunction: 9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the true() XPath function 9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean true() 9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); 9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFalseFunction: 9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the false() XPath function 9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean false() 9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); 9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLangFunction: 9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the lang() XPath function 9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean lang(string) 9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lang function returns true or false depending on whether the 9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * language of the context node as specified by xml:lang attributes 9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is the same as or is a sublanguage of the language specified by 9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument string. The language of the context node is determined 9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the value of the xml:lang attribute on the context node, or, if 9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node has no xml:lang attribute, by the value of the 9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xml:lang attribute on the nearest ancestor of the context node that 9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * has an xml:lang attribute. If there is no such attribute, then lang 9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns false. If there is such an attribute, then lang returns 9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * true if the attribute value is equal to the argument ignoring case, 9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or if there is some suffix starting with - such that the attribute 9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value is equal to the argument ignoring that suffix of the attribute 9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value and ignoring case. 9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val = NULL; 9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *theLang = NULL; 9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *lang; 9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = valuePop(ctxt); 9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lang = val->stringval; 9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project theLang = xmlNodeGetLang(ctxt->context->node); 9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((theLang != NULL) && (lang != NULL)) { 9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;lang[i] != 0;i++) 9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toupper(lang[i]) != toupper(theLang[i])) 9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_equal; 9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((theLang[i] == 0) || (theLang[i] == '-')) 9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_equal: 9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (theLang != NULL) 9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((void *)theLang); 9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, val); 9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); 9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNumberFunction: 9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the number() XPath function 9494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number number(object?) 9495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double res; 9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) { 9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0)); 9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar* content = xmlNodeGetContent(ctxt->context->node); 9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathStringEvalNumber(content); 9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); 9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur)); 9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSumFunction: 9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the sum() XPath function 9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number sum(node-set) 9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The sum function returns the sum of the values of the nodes in 9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument node-set. 9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double res = 0.0; 9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 953760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->value == NULL) || 9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) { 9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < cur->nodesetval->nodeNr; i++) { 9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]); 9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); 9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * To assure working code on multiple platforms, we want to only depend 9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upon the characteristic truncation of converting a floating point value 9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to an integer. Unfortunately, because of the different storage sizes 9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of our internal floating point value (double) and integer (int), we 9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * can't directly convert (see bug 301162). This macro is a messy 9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 'workaround' 9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XTRUNC(f, v) \ 9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = fmod((v), INT_MAX); \ 9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = (v) - (f) + (double)((int)(f)); 9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFloorFunction: 9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the floor() XPath function 9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number floor(number) 9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The floor function returns the largest (closest to positive infinity) 9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not greater than the argument and that is an integer. 9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double f; 9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XTRUNC(f, ctxt->value->floatval); 9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f != ctxt->value->floatval) { 9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval > 0) 9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f - 1; 9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCeilingFunction: 9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the ceiling() XPath function 9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number ceiling(number) 9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ceiling function returns the smallest (closest to negative infinity) 9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not less than the argument and that is an integer. 9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double f; 9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = ceil(ctxt->value->floatval); 9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XTRUNC(f, ctxt->value->floatval); 9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f != ctxt->value->floatval) { 9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval > 0) 9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f + 1; 9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < 0 && f == 0) 9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNZERO; 9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoundFunction: 9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the round() XPath function 9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number round(number) 9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The round function returns the number that is closest to the 9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument and that is an integer. If there are two such numbers, 9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the one that is even is returned. 9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double f; 9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlXPathIsNaN(ctxt->value->floatval)) || 9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathIsInf(ctxt->value->floatval) == 1) || 9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathIsInf(ctxt->value->floatval) == -1) || 9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->floatval == 0.0)) 9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XTRUNC(f, ctxt->value->floatval); 9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < 0) { 9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < f - 0.5) 9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f - 1; 965660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval == 0) 9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNZERO; 9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < f + 0.5) 9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 966360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f + 1; 9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The Parser * 9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a few forward declarations since we use a recursive call based 9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation. 9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort); 9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter); 9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt); 9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt); 9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, 9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int qualified); 9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCurrentChar: 9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context 9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: pointer to the beginning of the char 9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: pointer to the length of the char read 9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple 9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer. 9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length 9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) { 9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char c; 9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int val; 9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->cur; 9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 971460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for the 0x110000 limit too 9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = *cur; 9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c & 0x80) { 9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[1] & 0xc0) != 0x80) 9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xe0) == 0xe0) { 9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[2] & 0xc0) != 0x80) 9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xf0) == 0xf0) { 9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0xf8) != 0xf0) || 9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur[3] & 0xc0) != 0x80)) 9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4-byte code */ 9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 4; 9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x7) << 18; 9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 12; 9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2] & 0x3f) << 6; 9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[3] & 0x3f; 9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3-byte code */ 9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 3; 9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0xf) << 12; 9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 6; 9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[2] & 0x3f; 9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2-byte code */ 9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 2; 9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x1f) << 6; 9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[1] & 0x3f; 9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_CHAR_ERROR); 975160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1-byte code */ 9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *cur); 9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error: 9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we detect an UTF8 error that probably means that the 9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input encoding didn't get properly advertised in the 9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration header. Report the error and switch the encoding 9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to ISO-Latin-1 (if you don't like this policy, just declare the 9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding !) 9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 0; 9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_ENCODING_ERROR); 9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseNCName: 9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML namespace non qualified name. 9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* 9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | 9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL 9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNCName(xmlXPathParserContextPtr ctxt) { 9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *in; 9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); 9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accelerator for simple ASCII names 9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->cur; 9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*in >= 0x61) && (*in <= 0x7A)) || 9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_')) { 9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*in >= 0x61) && (*in <= 0x7A)) || 9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x30) && (*in <= 0x39)) || 9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == '.') || 9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '-')) 9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*in == ' ') || (*in == '>') || (*in == '/') || 9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '[') || (*in == ']') || (*in == ':') || 9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '@') || (*in == '*')) { 9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = in - ctxt->cur; 9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count == 0) 9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(ctxt->cur, count); 9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = in; 9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathParseNameComplex(ctxt, 0)); 9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseQName: 9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 982360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @prefix: a xmlChar ** 9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML qualified name 9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 5] QName ::= (Prefix ':')? LocalPart 9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 6] Prefix ::= NCName 9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 7] LocalPart ::= NCName 9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the function returns the local part, and prefix is updated 9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to get the Prefix if any. 9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) { 9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = NULL; 9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathParseNCName(ctxt); 984360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret && CUR == ':') { 9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = ret; 9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathParseNCName(ctxt); 9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseName: 9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML name 9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | 9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)* 9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL 9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseName(xmlXPathParserContextPtr ctxt) { 9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *in; 9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); 9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accelerator for simple ASCII names 9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->cur; 9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*in >= 0x61) && (*in <= 0x7A)) || 9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == ':')) { 9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*in >= 0x61) && (*in <= 0x7A)) || 9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x30) && (*in <= 0x39)) || 9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == '-') || 9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == ':') || (*in == '.')) 9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*in > 0) && (*in < 0x80)) { 9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = in - ctxt->cur; 9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(ctxt->cur, count); 9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = in; 9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathParseNameComplex(ctxt, 1)); 9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) { 9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[XML_MAX_NAMELEN + 5]; 9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0, l; 9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c; 9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handler for more complex cases 9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ 9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '[') || (c == ']') || (c == '@') || /* accelerators */ 9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '*') || /* accelerators */ 9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!IS_LETTER(c) && (c != '_') && 9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((qualified) && (c != ':')))) { 9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ 9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_LETTER(c)) || (IS_DIGIT(c)) || 9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 991760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '_') || ((qualified) && (c == ':')) || 9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c)))) { 9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buf,len,c); 9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len >= XML_MAX_NAMELEN) { 9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Okay someone managed to make a huge name, so he's ready to pay 9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for the processing speed. 9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max = len * 2; 993060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); 9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_MEMORY_ERROR); 9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(buffer, buf, len); 9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */ 9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 993860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '_') || ((qualified) && (c == ':')) || 9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c))) { 9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len + 10 > max) { 9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max *= 2; 9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlRealloc(buffer, 9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max * sizeof(xmlChar)); 9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_MEMORY_ERROR); 9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buffer,len,c); 9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer[len] = 0; 9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(buffer); 9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len == 0) 9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrndup(buf, len)); 9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_FRAC 20 9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * These are used as divisors for the fractional part of a number. 9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since the table includes 1.0 (representing '0' fractional digits), 9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it must be dimensioned at MAX_FRAC+1 (bug 133921) 9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double my_pow10[MAX_FRAC+1] = { 9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1.0, 10.0, 100.0, 1000.0, 10000.0, 9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 100000000000000.0, 9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0 9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringEvalNumber: 9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: A string to scan 9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30a] Float ::= Number ('e' Digits?)? 9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30] Number ::= Digits ('.' Digits?)? 998560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | '.' Digits 9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31] Digits ::= [0-9]+ 9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number in the string 9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In complement of the Number expression, this function also handles 9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * negative values : '-' Number. 9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the double value. 9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringEvalNumber(const xmlChar *str) { 9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = str; 9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ok = 0; 9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isneg = 0; 10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int exponent = 0; 10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_exponent_negative = 0; 10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long tmp = 0; 10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double temp; 10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(0); 10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { 10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '-') { 10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project isneg = 1; 10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * tmp/temp is a workaround against a gcc compiler bug 10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://veillard.com/gcc.bug 10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10; 10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (*cur - '0'); 10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (double) tmp; 10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + temp; 10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (*cur - '0'); 10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '.') { 10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int v, frac = 0; 10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double fraction = 0; 10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*cur < '0') || (*cur > '9')) && (!ok)) { 10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) { 10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project v = (*cur - '0'); 10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction = fraction * 10 + v; 10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project frac = frac + 1; 10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction /= my_pow10[frac]; 10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + fraction; 10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) 10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur == 'e') || (*cur == 'E')) { 10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '-') { 10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_exponent_negative = 1; 10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '+') { 10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exponent = exponent * 10 + (*cur - '0'); 10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur != 0) return(xmlXPathNAN); 10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (isneg) ret = -ret; 10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_exponent_negative) exponent = -exponent; 10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret *= pow(10.0, (double)exponent); 10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNumber: 10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30] Number ::= Digits ('.' Digits?)? 1008460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | '.' Digits 10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31] Digits ::= [0-9]+ 10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number, then push it on the stack 10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNumber(xmlXPathParserContextPtr ctxt) 10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret = 0.0; 10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ok = 0; 10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int exponent = 0; 10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_exponent_negative = 0; 10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long tmp = 0; 10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double temp; 10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) { 10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_NUMBER_ERROR); 10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * tmp/temp is a workaround against a gcc compiler bug 10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://veillard.com/gcc.bug 10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10; 10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (CUR - '0'); 10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (double) tmp; 10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + temp; 10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (CUR - '0'); 10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '.') { 10129df143a5041f03a22808b59c76698770b74692815Selim Gurun int v, frac = 0; 10130df143a5041f03a22808b59c76698770b74692815Selim Gurun double fraction = 0; 10131df143a5041f03a22808b59c76698770b74692815Selim Gurun 10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((CUR < '0') || (CUR > '9')) && (!ok)) { 10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_NUMBER_ERROR); 10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10136df143a5041f03a22808b59c76698770b74692815Selim Gurun while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) { 10137df143a5041f03a22808b59c76698770b74692815Selim Gurun v = (CUR - '0'); 10138df143a5041f03a22808b59c76698770b74692815Selim Gurun fraction = fraction * 10 + v; 10139df143a5041f03a22808b59c76698770b74692815Selim Gurun frac = frac + 1; 10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10142df143a5041f03a22808b59c76698770b74692815Selim Gurun fraction /= my_pow10[frac]; 10143df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = ret + fraction; 10144df143a5041f03a22808b59c76698770b74692815Selim Gurun while ((CUR >= '0') && (CUR <= '9')) 10145df143a5041f03a22808b59c76698770b74692815Selim Gurun NEXT; 10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == 'e') || (CUR == 'E')) { 10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '-') { 10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_exponent_negative = 1; 10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '+') { 10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exponent = exponent * 10 + (CUR - '0'); 10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_exponent_negative) 10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exponent = -exponent; 10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret *= pow(10.0, (double) exponent); 10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0, 10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewFloat(ctxt->context, ret), NULL); 10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseLiteral: 10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal 10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Literal ::= '"' [^"]* '"' 10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "'" [^']* "'" 10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value found or NULL in case of error 10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) { 10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q; 10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '"')) 10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); 10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) 10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); 10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_START_LITERAL_ERROR); 10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLiteral: 10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal and push it on the stack. 10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Literal ::= '"' [^"]* '"' 10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "'" [^']* "'" 10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: xmlXPathCompLiteral memory allocation could be improved. 10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) { 10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q; 10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '"')) 10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); 10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) 10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); 10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_START_LITERAL_ERROR); 10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) return; 10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, 10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, ret), NULL); 10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompVariableReference: 10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a VariableReference, evaluate it and push it on the stack. 10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings consist of a mapping from variable names 10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to variable values. The value of a variable is an object, which can be 10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of any of the types that are possible for the value of an expression, 10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and may also be of additional types not specified here. 10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Early evaluation is possible since: 10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings [...] used to evaluate a subexpression are 1027160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * always the same as those used to evaluate the containing expression. 10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1027360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [36] VariableReference ::= '$' QName 10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) { 10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix; 10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '$') { 10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_VARIABLE_REF_ERROR); 10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseQName(ctxt, &prefix); 10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_VARIABLE_REF_ERROR); 10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0, 10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, prefix); 10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) { 10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_UNDEF_VARIABLE_ERROR); 10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNodeType: 10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: a name string 10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is the name given a NodeType one. 10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [38] NodeType ::= 'comment' 10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'text' 10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'processing-instruction' 10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'node' 10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 otherwise 10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNodeType(const xmlChar *name) { 10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "node")) 10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "text")) 10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "comment")) 10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "processing-instruction")) 10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFunctionCall: 10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument)*)? ')' 1033260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [17] Argument ::= Expr 10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a function call, the evaluation of all arguments are 10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pushed on the stack 10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) { 10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix; 10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbargs = 0; 10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int sort = 1; 10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseQName(ctxt, &prefix); 10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1034660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFree(prefix); 10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Calling function %s\n", 10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name); 10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n", 10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix, name); 10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '(') { 10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for count(): we don't need the node-set to be sorted. 10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix == NULL) && (name[0] == 'c') && 10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrEqual(name, BAD_CAST "count")) 10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sort = 0; 10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR != 0) { 10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, sort); 1037960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt->error != XPATH_EXPRESSION_OK) { 1038060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFree(name); 1038160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFree(prefix); 1038260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 1038360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0); 10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbargs++; 10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ')') break; 10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ',') { 10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0, 10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, prefix); 10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPrimaryExpr: 10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1040460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [15] PrimaryExpr ::= VariableReference 10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | '(' Expr ')' 1040660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | Literal 1040760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | Number 1040860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | FunctionCall 10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a primary expression. 10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) { 10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '$') xmlXPathCompVariableReference(ctxt); 10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (CUR == '(') { 10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { 10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompNumber(ctxt); 10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '\'') || (CUR == '"')) { 10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompLiteral(ctxt); 10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompFunctionCall(ctxt); 10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFilterExpr: 10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1044060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [20] FilterExpr ::= PrimaryExpr 1044160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | FilterExpr Predicate 10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a filter expression. 10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Square brackets are used to filter expressions in the same way that 10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they are used in location paths. It is an error if the expression to 10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be filtered does not evaluate to a node-set. The context node list 10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used for evaluating the expression in square brackets is the node-set 10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be filtered listed in document order. 10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) { 10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPrimaryExpr(ctxt); 10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1045660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '[') { 10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPredicate(ctxt, 1); 10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1046260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathScanName: 10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Trickery: parse an XML name but without consuming the input flow 10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Needed to avoid insanity in the parser state. 10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | 10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)* 10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] Names ::= Name (S Name)* 10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL 10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathScanName(xmlXPathParserContextPtr ctxt) { 10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0, l; 10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c; 10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->cur; 10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ 10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!IS_LETTER(c) && (c != '_') && 10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c != ':'))) { 10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ 10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_LETTER(c)) || (IS_DIGIT(c)) || 10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 1050160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (c == '_') || (c == ':') || 10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c)))) { 10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len += l; 10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(cur, ctxt->cur - cur); 10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = cur; 10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPathExpr: 10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1051760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [19] PathExpr ::= LocationPath 1051860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | FilterExpr 1051960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | FilterExpr '/' RelativeLocationPath 1052060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | FilterExpr '//' RelativeLocationPath 10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a path expression. 10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator and // operators combine an arbitrary expression 10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a relative location path. It is an error if the expression 10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * does not evaluate to a node-set. 10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator does composition in the same way as when / is 10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used in a location path. As in location paths, // is short for 10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * /descendant-or-self::node()/. 10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { 10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lc = 1; /* Should we branch to LocationPath ? */ 10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name = NULL; /* we may have to preparse a name to find out */ 10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1053760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((CUR == '$') || (CUR == '(') || 1053860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (IS_ASCII_DIGIT(CUR)) || 10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '\'') || (CUR == '"') || 10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { 10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 0; 10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '*') { 10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative or absolute location path */ 10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative or absolute location path */ 10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '@') { 10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative abbreviated attribute location path */ 10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '.') { 10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative abbreviated attribute location path */ 10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Problem is finding if we have a name here whether it's: 10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a nodetype 10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a function call in which case it's followed by '(' 10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an axis in which case it's followed by ':' 10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a element name 10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We do an a priori analysis here rather than having to 10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * maintain parsed token content through the recursive function 10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * calls. This looks uglier but makes the code easier to 10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * read/write/debug. 10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathScanName(ctxt); 10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) { 10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: Axis\n"); 10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (name != NULL) { 10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len =xmlStrlen(name); 10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1057860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (NXT(len) != 0) { 10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(len) == '/') { 10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* element name */ 10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_BLANK_CH(NXT(len))) { 10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ignore blanks */ 10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ; 10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (NXT(len) == ':') { 10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((NXT(len) == '(')) { 10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Note Type or Function */ 10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNodeType(name)) { 10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: Type search\n"); 10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: function call\n"); 10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 0; 10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((NXT(len) == '[')) { 10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* element name */ 10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((NXT(len) == '<') || (NXT(len) == '>') || 10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(len) == '=')) { 10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len++; 10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(len) == 0) { 10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* element name */ 10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* make sure all cases are covered explicitly */ 10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1064560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lc) { 10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0); 10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); 10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompLocationPath(ctxt); 10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompFilterExpr(ctxt); 10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0); 10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnionExpr: 10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1067760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [18] UnionExpr ::= PathExpr 1067860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | UnionExpr '|' PathExpr 10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an union expression. 10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) { 10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPathExpr(ctxt); 10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '|') { 10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); 10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPathExpr(ctxt); 10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0); 10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnaryExpr: 10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1070660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [27] UnaryExpr ::= UnionExpr 1070760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | '-' UnaryExpr 10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an unary expression. 10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) { 10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int minus = 0; 10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '-') { 10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project minus = 1 - minus; 10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompUnionExpr(ctxt); 10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (found) { 10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (minus) 10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0); 10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0); 10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompMultiplicativeExpr: 10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1073960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [26] MultiplicativeExpr ::= UnaryExpr 1074060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | MultiplicativeExpr MultiplyOperator UnaryExpr 1074160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | MultiplicativeExpr 'div' UnaryExpr 1074260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | MultiplicativeExpr 'mod' UnaryExpr 10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [34] MultiplyOperator ::= '*' 10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression. 10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) { 10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompUnaryExpr(ctxt); 10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1075360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while ((CUR == '*') || 10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) || 10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) { 10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op = -1; 10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = 0; 10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == 'd') { 10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = 1; 10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == 'm') { 10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = 2; 10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompUnaryExpr(ctxt); 10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0); 10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAdditiveExpr: 10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1078160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [25] AdditiveExpr ::= MultiplicativeExpr 1078260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AdditiveExpr '+' MultiplicativeExpr 1078360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AdditiveExpr '-' MultiplicativeExpr 10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression. 10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) { 10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompMultiplicativeExpr(ctxt); 10792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '+') || (CUR == '-')) { 10795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int plus; 10796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '+') plus = 1; 10799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else plus = 0; 10800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompMultiplicativeExpr(ctxt); 10803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0); 10805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelationalExpr: 10811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1081360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [24] RelationalExpr ::= AdditiveExpr 1081460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | RelationalExpr '<' AdditiveExpr 1081560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | RelationalExpr '>' AdditiveExpr 1081660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | RelationalExpr '<=' AdditiveExpr 1081760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | RelationalExpr '>=' AdditiveExpr 10818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A <= B > C is allowed ? Answer from James, yes with 10820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (AdditiveExpr <= AdditiveExpr) > AdditiveExpr 10821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which is basically what got implemented. 10822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Relational expression, then push the result 10824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the stack 10825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) { 10829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAdditiveExpr(ctxt); 10830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '<') || 10833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '>') || 10834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == '<') && (NXT(1) == '=')) || 10835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == '>') && (NXT(1) == '='))) { 10836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inf, strict; 10837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '<') inf = 1; 10840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else inf = 0; 10841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(1) == '=') strict = 0; 10842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else strict = 1; 10843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!strict) NEXT; 10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAdditiveExpr(ctxt); 10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict); 10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompEqualityExpr: 10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1085760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [23] EqualityExpr ::= RelationalExpr 1085860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | EqualityExpr '=' RelationalExpr 1085960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | EqualityExpr '!=' RelationalExpr 10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A != B != C is allowed ? Answer from James, yes with 10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (RelationalExpr = RelationalExpr) = RelationalExpr 10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (RelationalExpr != RelationalExpr) != RelationalExpr 10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which is basically what got implemented. 10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Equality expression. 10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) { 10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelationalExpr(ctxt); 10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) { 10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int eq; 10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '=') eq = 1; 10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else eq = 0; 10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!eq) NEXT; 10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelationalExpr(ctxt); 10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0); 10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAndExpr: 10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1089460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [22] AndExpr ::= EqualityExpr 1089560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AndExpr 'and' EqualityExpr 10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an AND expression. 10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) { 10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompEqualityExpr(ctxt); 10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) { 10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompEqualityExpr(ctxt); 10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0); 10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompileExpr: 10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1092060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [14] Expr ::= OrExpr 1092160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [21] OrExpr ::= AndExpr 1092260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | OrExpr 'or' AndExpr 10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and compile an expression 10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) { 10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAndExpr(ctxt); 10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == 'o') && (NXT(1) == 'r')) { 10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAndExpr(ctxt); 10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0); 10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) { 10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* more ops could be optimized too */ 10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the main place to eliminate sorting for 10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * operations which don't require a sorted node-set. 10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E.g. count(). 10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0); 10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPredicate: 10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filter: act as a filter 10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8] Predicate ::= '[' PredicateExpr ']' 1095760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [9] PredicateExpr ::= Expr 10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a predicate expression 10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) { 10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '[') { 10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); 10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This call to xmlXPathCompileExpr() will deactivate sorting 10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the predicate result. 10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Sorting is still activated for filters, since I'm not 10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * sure if needed. Normally sorting should not be needed, since 10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a filter can only diminish the number of items in a sequence, 10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * but won't change its order; so if the initial sequence is sorted, 10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subsequent sorting is not needed. 10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! filter) 10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 0); 10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ']') { 10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); 10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filter) 10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0); 10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0); 10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNodeTest: 11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test: pointer to a xmlXPathTestVal 11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: pointer to a xmlXPathTypeVal 11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: placeholder for a possible name prefix 11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7] NodeTest ::= NameTest 11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | NodeType '(' ')' 11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'processing-instruction' '(' Literal ')' 11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] NameTest ::= '*' 11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | NCName ':' '*' 11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | QName 11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [38] NodeType ::= 'comment' 11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'text' 11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'processing-instruction' 11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'node' 11019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the name found and updates @test, @type and @prefix appropriately 11021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test, 11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal *type, const xmlChar **prefix, 11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name) { 11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int blanks; 11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((test == NULL) || (type == NULL) || (prefix == NULL)) { 11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE; 11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = (xmlXPathTypeVal) 0; 11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = (xmlXPathTestVal) 0; 11034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = NULL; 11035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name == NULL) && (CUR == '*')) { 11038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All elements 11040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_ALL; 11043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 11044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 11047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 11049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_EXPR_ERROR); 11050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blanks = IS_BLANK_CH(CUR); 11053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '(') { 11055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NodeType or PI search 11058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "comment")) 11060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_COMMENT; 11061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(name, BAD_CAST "node")) 11062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_NODE; 11063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(name, BAD_CAST "processing-instruction")) 11064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_PI; 11065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(name, BAD_CAST "text")) 11066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_TEXT; 11067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 11068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 11069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_EXPR_ERROR); 11071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_TYPE; 1107460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 11075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*type == NODE_TYPE_PI) { 11077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Specific case: search a PI by name. 11079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 11081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 11083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 11084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseLiteral(ctxt); 11085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR NULL; 11086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_PI; 11087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 11091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 11092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_UNCLOSED_ERROR); 11094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(name); 11097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_NAME; 11099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!blanks) && (CUR == ':')) { 11100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since currently the parser context don't have a 11104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace list associated: 11105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The namespace name for this prefix can be computed 11106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only at evaluation time. The compilation is done 11107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * outside of any context. 11108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 11110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = xmlXPathNsLookup(ctxt->context, name); 11111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 11112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*prefix == NULL) { 11114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); 11115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 11117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = name; 11118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 11121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All elements 11123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_ALL; 11126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 11127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 11131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_EXPR_ERROR); 11132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(name); 11135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAxisName: 11139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: a preparsed name token 11140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] AxisName ::= 'ancestor' 11142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'ancestor-or-self' 11143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'attribute' 11144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'child' 11145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'descendant' 11146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'descendant-or-self' 11147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'following' 11148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'following-sibling' 11149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'namespace' 11150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'parent' 11151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'preceding' 11152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'preceding-sibling' 11153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'self' 11154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the axis or 0 11156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathAxisVal 11158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAxisName(const xmlChar *name) { 11159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal ret = (xmlXPathAxisVal) 0; 11160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (name[0]) { 11161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'a': 11162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "ancestor")) 11163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_ANCESTOR; 11164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "ancestor-or-self")) 11165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_ANCESTOR_OR_SELF; 11166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "attribute")) 11167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_ATTRIBUTE; 11168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'c': 11170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "child")) 11171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_CHILD; 11172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'd': 11174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "descendant")) 11175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_DESCENDANT; 11176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "descendant-or-self")) 11177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_DESCENDANT_OR_SELF; 11178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'f': 11180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "following")) 11181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_FOLLOWING; 11182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "following-sibling")) 11183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_FOLLOWING_SIBLING; 11184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': 11186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "namespace")) 11187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_NAMESPACE; 11188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'p': 11190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "parent")) 11191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_PARENT; 11192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "preceding")) 11193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_PRECEDING; 11194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "preceding-sibling")) 11195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_PRECEDING_SIBLING; 11196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 's': 11198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "self")) 11199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_SELF; 11200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 11203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompStep: 11207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] Step ::= AxisSpecifier NodeTest Predicate* 1121060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AbbreviatedStep 11211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] AbbreviatedStep ::= '.' | '..' 11213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] AxisSpecifier ::= AxisName '::' 11215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedAxisSpecifier 11216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13] AbbreviatedAxisSpecifier ::= '@'? 11218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified for XPtr range support as: 11220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4xptr] Step ::= AxisSpecifier NodeTest Predicate* 11222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedStep 11223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'range-to' '(' Expr ')' Predicate* 11224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile one step in a Location Path 11226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A location step of . is short for self::node(). This is 11227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * particularly useful in conjunction with //. For example, the 11228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location path .//para is short for 11229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * self::node()/descendant-or-self::node()/child::para 11230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select all para descendant elements of the context 11231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node. 11232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Similarly, a location step of .. is short for parent::node(). 11233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For example, ../title is short for parent::node()/child::title 11234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select the title children of the parent of the context 11235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node. 11236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompStep(xmlXPathParserContextPtr ctxt) { 11239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rangeto = 0; 11241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op2 = -1; 11242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '.') && (NXT(1) == '.')) { 11246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT, 11249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '.') { 11251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name = NULL; 11255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = NULL; 11256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test = (xmlXPathTestVal) 0; 11257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal axis = (xmlXPathAxisVal) 0; 11258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal type = (xmlXPathTypeVal) 0; 11259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1; 11260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The modification needed for XPointer change to the production 11263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->xptr) { 11266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) { 11268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op2 = ctxt->comp->last; 11269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '(') { 11272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 11273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 11278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */ 11279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 11280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 11283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 11284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rangeto = 1; 11287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto eval_predicates; 11288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 11292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 11295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 11297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = xmlXPathIsAxisName(name); 11298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (axis != 0) { 11299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == ':') && (NXT(1) == ':')) { 11301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 11304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* an element name can conflict with an axis one :-\ */ 11306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '@') { 11312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_ATTRIBUTE; 11314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11319df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->error != XPATH_EXPRESSION_OK) { 11320df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(name); 11321df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 11322df143a5041f03a22808b59c76698770b74692815Selim Gurun } 11323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name); 11325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (test == 0) 11326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 11327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix != NULL) && (ctxt->context != NULL) && 11329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->flags & XML_XPATH_CHECKNS)) { 11330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) { 11331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR); 11332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Basis : computing new set\n"); 11337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Basis : "); 11341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 11342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "no value\n"); 11343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->nodesetval == NULL) 11344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Empty\n"); 11345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval); 11347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecteval_predicates: 11351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op1 = ctxt->comp->last; 11353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 11354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '[') { 11357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPredicate(ctxt, 0); 11358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rangeto) { 11362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0); 11363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 11364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis, 11366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test, type, (void *)prefix, (void *)name); 11367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Step : "); 11371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 11372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "no value\n"); 11373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->nodesetval == NULL) 11374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Empty\n"); 11375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContextNodeSet(xmlGenericErrorContext, 11377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval); 11378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelativeLocationPath: 11383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1138560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [3] RelativeLocationPath ::= Step 1138660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | RelativeLocationPath '/' Step 1138760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AbbreviatedRelativeLocationPath 1138860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step 11389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a relative location path. 11391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelativeLocationPath 11394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(xmlXPathParserContextPtr ctxt) { 11395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 11397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 11400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 11402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompStep(ctxt); 11406df143a5041f03a22808b59c76698770b74692815Selim Gurun CHECK_ERROR; 11407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '/') { 11409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 11410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 11413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompStep(ctxt); 11415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 11416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompStep(ctxt); 11419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLocationPath: 11426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1142860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [1] LocationPath ::= RelativeLocationPath 1142960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AbsoluteLocationPath 11430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [2] AbsoluteLocationPath ::= '/' RelativeLocationPath? 1143160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * | AbbreviatedAbsoluteLocationPath 1143260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * [10] AbbreviatedAbsoluteLocationPath ::= 1143360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * '//' RelativeLocationPath 11434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a location path 11436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * // is short for /descendant-or-self::node()/. For example, 11438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * //para is short for /descendant-or-self::node()/child::para and 11439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so will select any para element in the document (even a para element 11440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is a document element will be selected by //para since the 11441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document element node is a child of the root node); div//para is 11442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * short for div/descendant-or-self::node()/child::para and so will 11443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * select all para descendants of div children. 11444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) { 11447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '/') { 11449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 11450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '/') { 11452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 11453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 11456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 11458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 11459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR != 0 ) && 11462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') || 11463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '@') || (CUR == '*'))) 11464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 11465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11466df143a5041f03a22808b59c76698770b74692815Selim Gurun CHECK_ERROR; 11467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 11472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1147360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * XPath precompiled expression evaluation * 11474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 11475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 11476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op); 11479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1148260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlXPathDebugDumpStepAxis(xmlXPathStepOpPtr op, 11483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbNodes) 11484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "new step : "); 1148660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (op->value) { 11487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR: 11488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' "); 11489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR_OR_SELF: 11491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'ancestors-or-self' "); 11493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ATTRIBUTE: 11495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'attributes' "); 11496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_CHILD: 11498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'child' "); 11499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT: 11501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'descendant' "); 11502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT_OR_SELF: 11504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'descendant-or-self' "); 11506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING: 11508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'following' "); 11509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING_SIBLING: 11511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'following-siblings' "); 11513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_NAMESPACE: 11515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'namespace' "); 11516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PARENT: 11518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'parent' "); 11519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING: 11521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'preceding' "); 11522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING_SIBLING: 11524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'preceding-sibling' "); 11526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_SELF: 11528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'self' "); 11529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " context contains %d nodes\n", nbNodes); 1153360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (op->value2) { 11534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NONE: 11535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for none !!!\n"); 11537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_TYPE: 11539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1154060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott " searching for type %d\n", op->value3); 11541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_PI: 11543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for PI !!!\n"); 11545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_ALL: 11547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for *\n"); 11549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NS: 11551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for namespace %s\n", 1155360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott op->value5); 11554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NAME: 11556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1155760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott " searching for name %s\n", op->value5); 1155860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (op->value4) 11559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1156060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott " with namespace %s\n", op->value4); 11561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Testing : "); 11564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* DEBUG_STEP */ 11566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt, 11569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr set, 11571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int contextSize, 11572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNsNodes) 11573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 11575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp = ctxt->comp; 11576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process inner predicates first. 11578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { 11580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: raise an internal error. 11582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextSize = xmlXPathCompOpEvalPredicate(ctxt, 11585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], set, contextSize, hasNsNodes); 11586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 11587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextSize <= 0) 11588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1158960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 11590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 11591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xpctxt = ctxt->context; 11592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr contextNode, oldContextNode; 11593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldContextDoc; 11594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, res, contextPos = 0, newContextSize; 11595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr exprOp; 11596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; 11597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Check the following: 11601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't expect location sets if evaluating prediates, right? 11602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only filters should expect location sets, right? 11603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 11607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "For each node in the node-set to be filtered, the 11608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PredicateExpr is evaluated with that node as the 11609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, with the number of nodes in the 11610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set as the context size, and with the proximity 11611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * position of the node in the node-set with respect to 11612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the axis as the context position;" 11613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @oldset is the node-set" to be filtered. 11614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 11616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "only predicates change the context position and 11617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context size (see [2.4 Predicates])." 11618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example: 11619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 11620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nA 1 11621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 2 11622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 3 11623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * After applying predicate [position() > 1] : 11624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 11625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 1 11626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 2 11627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextNode = xpctxt->node; 11629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextDoc = xpctxt->doc; 11630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the expression of this predicate. 11632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1163360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott exprOp = &ctxt->comp->steps[op->ch2]; 11634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize = 0; 11635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < set->nodeNr; i++) { 11636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set->nodeTab[i] == NULL) 11637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 11638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = set->nodeTab[i]; 11640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextNode; 11641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = contextSize; 11642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = ++contextPos; 1164360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1164460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 11645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 11646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() are evaluated in the predicate. 11647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contextNode->type != XML_NAMESPACE_DECL) && 11649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (contextNode->doc != NULL)) 11650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = contextNode->doc; 11651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the predicate expression with 1 context node 11653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * at a time; this node is packaged into a node set; this 11654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node set is handed over to the evaluation mechanism. 11655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj == NULL) 11657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); 11658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(contextObj->nodesetval, 11660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode); 11661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, contextObj); 11663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); 11665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { 11667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize = 0; 11669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) { 11673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize++; 11674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Remove the entry from the initial node set. 11677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[i] = NULL; 11679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode->type == XML_NAMESPACE_DECL) 11680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); 11681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) { 11683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary XPath object holding the 11685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, in order to avoid massive recreation 11686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inside this loop. 11687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); 11690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: The object was lost in the evaluation machinery. 11693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Can this happen? Maybe in internal-error cases. 11694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = NULL; 11696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj != NULL) { 11700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) 11701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, contextObj); 1170360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 11704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit: 11705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exprRes != NULL) 11706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, exprRes); 11707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset/invalidate the context. 11709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = oldContextNode; 11711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = oldContextDoc; 11712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = -1; 11713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = -1; 11714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(newContextSize); 11715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(contextSize); 11717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt, 11721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr set, 11723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int contextSize, 11724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int minPos, 11725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxPos, 11726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNsNodes) 11727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 11729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp = ctxt->comp; 11730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { 11731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: raise an internal error. 11733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextSize = xmlXPathCompOpEvalPredicate(ctxt, 11736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], set, contextSize, hasNsNodes); 11737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 11738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextSize <= 0) 11739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the node set contains a sufficient number of nodes for 11743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the requested range. 11744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextSize < minPos) { 11746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) { 11750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Can this ever happen? 11752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (contextSize); 11754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldContextDoc; 11756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, pos = 0, newContextSize = 0, contextPos = 0, res; 11757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr exprOp; 11758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; 11759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldContextNode, contextNode = NULL; 11760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xpctxt = ctxt->context; 11761df143a5041f03a22808b59c76698770b74692815Selim Gurun int frame; 11762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Check the following: 11766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't expect location sets if evaluating prediates, right? 11767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only filters should expect location sets, right? 11768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 11770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Save old context. 11773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextNode = xpctxt->node; 11775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextDoc = xpctxt->doc; 11776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the expression of this predicate. 11778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprOp = &ctxt->comp->steps[op->ch2]; 11780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < set->nodeNr; i++) { 11781df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathObjectPtr tmp; 11782df143a5041f03a22808b59c76698770b74692815Selim Gurun 11783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set->nodeTab[i] == NULL) 11784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 11785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = set->nodeTab[i]; 11787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextNode; 11788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = contextSize; 11789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = ++contextPos; 1179060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 11791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the new set. 11793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 11794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() evaluation are attempted on the predicate 11795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contextNode->type != XML_NAMESPACE_DECL) && 11797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (contextNode->doc != NULL)) 11798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = contextNode->doc; 11799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the predicate expression with 1 context node 11801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * at a time; this node is packaged into a node set; this 11802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node set is handed over to the evaluation mechanism. 11803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj == NULL) 11805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); 11806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(contextObj->nodesetval, 11808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode); 11809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11810df143a5041f03a22808b59c76698770b74692815Selim Gurun frame = xmlXPathSetFrame(ctxt); 11811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, contextObj); 11812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); 11813df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp = valuePop(ctxt); 11814df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathPopFrame(ctxt, frame); 1181560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 11816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { 11817df143a5041f03a22808b59c76698770b74692815Selim Gurun while (tmp != contextObj) { 11818df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 11819df143a5041f03a22808b59c76698770b74692815Selim Gurun * Free up the result 11820df143a5041f03a22808b59c76698770b74692815Selim Gurun * then pop off contextObj, which will be freed later 11821df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 11822df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathReleaseObject(xpctxt, tmp); 11823df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp = valuePop(ctxt); 11824df143a5041f03a22808b59c76698770b74692815Selim Gurun } 11825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_error; 11826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11827df143a5041f03a22808b59c76698770b74692815Selim Gurun /* push the result back onto the stack */ 11828df143a5041f03a22808b59c76698770b74692815Selim Gurun valuePush(ctxt, tmp); 11829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res) 11831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pos++; 11832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res && (pos >= minPos) && (pos <= maxPos)) { 11834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fits in the requested range. 11836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize++; 11838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (minPos == maxPos) { 11839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only 1 node was requested. 11841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode->type == XML_NAMESPACE_DECL) { 11843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * As always: take care of those nasty 11845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace nodes. 11846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[i] = NULL; 11848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeNr = 1; 1185160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott set->nodeTab[0] = contextNode; 11852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 1185360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 11854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pos == maxPos) { 11855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are done. 11857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes); 11859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Remove the entry from the initial node set. 11864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[i] = NULL; 11866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode->type == XML_NAMESPACE_DECL) 11867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); 11868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exprRes != NULL) { 11870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, exprRes); 11871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprRes = NULL; 11872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) { 11874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary XPath object holding the 11876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, in order to avoid massive recreation 11877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inside this loop. 11878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); 11881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The object was lost in the evaluation machinery. 11884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Can this happen? Maybe in case of internal-errors. 11885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = NULL; 11887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_error: 11892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize = 0; 11894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit: 11896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj != NULL) { 11897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) 11898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, contextObj); 11900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exprRes != NULL) 11902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, exprRes); 11903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset/invalidate the context. 11905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = oldContextNode; 11907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = oldContextDoc; 11908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = -1; 11909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = -1; 11910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(newContextSize); 11911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(contextSize); 11913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt, 1191760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathStepOpPtr op, 11918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *maxPos) 11919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr exprOp; 11922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BIG NOTE: This is not intended for XPATH_OP_FILTER yet! 11925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1192660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 11927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If not -1, then ch1 will point to: 11929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1) For predicates (XPATH_OP_PREDICATE): 11930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an inner predicate operator 11931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2) For filters (XPATH_OP_FILTER): 11932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an inner filter operater OR 11933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an expression selecting the node set. 11934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E.g. "key('a', 'b')" or "(//foo | //bar)". 1193560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 11936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER)) 11937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 11940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprOp = &ctxt->comp->steps[op->ch2]; 1194160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else 11942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exprOp != NULL) && 11945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exprOp->op == XPATH_OP_VALUE) && 11946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exprOp->value4 != NULL) && 11947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER)) 11948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 11949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We have a "[n]" predicate here. 11951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Unfortunately this simplistic test here is not 11952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * able to detect a position() predicate in compound 11953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expressions like "[@attr = 'a" and position() = 1], 11954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and even not the usage of position() in 11955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "[position() = 1]"; thus - obviously - a position-range, 11956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * like it "[position() < 5]", is also not detected. 11957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Maybe we could rewrite the AST to ease the optimization. 11958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval; 1196060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 11961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((xmlXPathObjectPtr) exprOp->value4)->floatval == 11962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (float) *maxPos) 1196360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 11964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 11965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt, 11972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr * first, xmlNodePtr * last, 11974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int toBool) 11975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT \ 11978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasAxisRange != 0) { \ 11979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (++pos == maxPos) { \ 11980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode(seq, cur); \ 11981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto axis_range_end; } \ 11982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { \ 11983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode(seq, cur); \ 11984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (breakOnFirstHit) goto first_hit; } 11985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT_NS \ 11987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasAxisRange != 0) { \ 11988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (++pos == maxPos) { \ 11989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasNsNodes = 1; \ 11990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur); \ 11991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto axis_range_end; } \ 11992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { \ 11993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasNsNodes = 1; \ 11994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddNs(seq, \ 11995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node, (xmlNsPtr) cur); \ 11996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (breakOnFirstHit) goto first_hit; } 11997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value; 11999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test = (xmlXPathTestVal) op->value2; 12000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3; 12001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value4; 12002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value5; 12003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URI = NULL; 12004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbMatches = 0, prevMatches = 0; 12007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0, hasNsNodes = 0; 12009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The popped object holding the context nodes */ 12010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 12011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The set of context nodes for the node tests */ 12012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr contextSeq; 12013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int contextIdx; 12014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr contextNode; 12015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The context node for a compound traversal */ 12016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr outerContextNode; 12017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The final resulting node set wrt to all context nodes */ 12018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr outSeq; 12019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The temporary resulting node set wrt 1 context node. 12021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used to feed predicate evaluation. 12022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr seq; 1202460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlNodePtr cur; 12025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* First predicate operator */ 12026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr predOp; 12027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxPos; /* The requested position() (when a "[n]" predicate) */ 12028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasPredicateRange, hasAxisRange, pos, size, newSize; 12029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int breakOnFirstHit; 12030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTraversalFunction next = NULL; 12032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* compound axis traversal */ 12033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTraversalFunctionExt outerNext = NULL; 12034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void (*addNode) (xmlNodeSetPtr, xmlNodePtr); 12035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetMergeFunction mergeAndClear; 1203660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlNodePtr oldContextNode; 12037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xpctxt = ctxt->context; 12038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 12042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Setup namespaces. 12044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) { 12046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlXPathNsLookup(xpctxt, prefix); 12047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 12048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 12049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); 12050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1205160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Setup axis. 12054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * MAYBE FUTURE TODO: merging optimizations: 12056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If the nodes to be traversed wrt to the initial nodes and 12057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the current axis cannot overlap, then we could avoid searching 12058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for duplicates during the merge. 12059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * But the question is how/when to evaluate if they cannot overlap. 12060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example: if we know that for two initial nodes, the one is 12061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not in the ancestor-or-self axis of the other, then we could safely 12062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * avoid a duplicate-aware merge, if the axis to be traversed is e.g. 12063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant-or-self axis. 12064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClear; 12066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (axis) { 12067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR: 12068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextAncestor; 12070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR_OR_SELF: 12072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextAncestorOrSelf; 12074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ATTRIBUTE: 12076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextAttribute; 12079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 12080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_CHILD: 12082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->rewriteType == XP_REWRITE_DOS_CHILD_ELEM) { 12084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This iterator will give us only nodes which can 12086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * hold element nodes. 12087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1208860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott outerNext = xmlXPathNextDescendantOrSelfElemParent; 1208960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) && 12091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type == NODE_TYPE_NODE)) 12092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization if an element node type is 'element'. 12095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextChildElement; 12097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextChild; 12099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 12100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT: 12102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextDescendant; 12104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT_OR_SELF: 12106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextDescendantOrSelf; 12108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING: 12110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextFollowing; 12112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING_SIBLING: 12114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextFollowingSibling; 12116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_NAMESPACE: 12118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = (xmlXPathTraversalFunction) xmlXPathNextNamespace; 12121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 12122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PARENT: 12124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextParent; 12126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING: 12128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextPrecedingInternal; 12130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING_SIBLING: 12132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextPrecedingSibling; 12134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_SELF: 12136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextSelf; 12139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 12140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 1214460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathDebugDumpStepAxis(op, 1214560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (obj->nodesetval != NULL) ? obj->nodesetval->nodeNr : 0); 12146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next == NULL) { 1214960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathReleaseObject(xpctxt, obj); 12150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1215160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextSeq = obj->nodesetval; 12153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) { 12154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 12155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL)); 12156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1215760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Predicate optimization --------------------------------------------- 12160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If this step has a last predicate, which contains a position(), 12161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then we'll optimize (although not exactly "position()", but only 12162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the short-hand form, i.e., "[n]". 12163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example - expression "/foo[parent::bar][1]": 1216560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 12166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COLLECT 'child' 'name' 'node' foo -- op (we are here) 12167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ROOT -- op->ch1 12168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE -- op->ch2 (predOp) 12169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE -- predOp->ch1 = [parent::bar] 12170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SORT 12171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COLLECT 'parent' 'name' 'node' bar 12172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NODE 12173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ELEM Object is a number : 1 -- predOp->ch2 = [1] 12174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxPos = 0; 12177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = NULL; 12178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasPredicateRange = 0; 12179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasAxisRange = 0; 12180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 12181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There's at least one predicate. 16 == XPATH_OP_PREDICATE 12183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = &ctxt->comp->steps[op->ch2]; 12185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) { 12186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (predOp->ch1 != -1) { 12187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use the next inner predicate operator. 12189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = &ctxt->comp->steps[predOp->ch1]; 12191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasPredicateRange = 1; 12192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There's no other predicate than the [n] predicate. 12195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = NULL; 12197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasAxisRange = 1; 1219860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0; 12202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Axis traversal ----------------------------------------------------- 12204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2.3 Node Tests 1220760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * - For the attribute axis, the principal node type is attribute. 12208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - For the namespace axis, the principal node type is namespace. 12209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - For other axes, the principal node type is element. 12210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A node test * is true for any node of the 12212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * principal node type. For example, child::* will 12213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * select all element children of the context node 12214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextNode = xpctxt->node; 12216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode = xmlXPathNodeSetAddUnique; 12217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = NULL; 12218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outerContextNode = NULL; 12220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = NULL; 12221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextIdx = 0; 12222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) { 12225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outerNext != NULL) { 12226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a compound traversal. 12228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode == NULL) { 12230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the context for the outer traversal. 12232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outerContextNode = contextSeq->nodeTab[contextIdx++]; 12234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = outerNext(NULL, outerContextNode); 12235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = outerNext(contextNode, outerContextNode); 12237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode == NULL) 12238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 12239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the context for the main traversal. 12241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextNode; 12243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 1224460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xpctxt->node = contextSeq->nodeTab[contextIdx++]; 1224560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq == NULL) { 12247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = xmlXPathNodeSetCreate(NULL); 12248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq == NULL) { 12249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 0; 12250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 12251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traverse the axis and test the nodes. 12255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pos = 0; 12257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = NULL; 12258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasNsNodes = 0; 12259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 12260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next(ctxt, cur); 12261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 12262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: What does the "first" and "last" stuff do? 12266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((first != NULL) && (*first != NULL)) { 12268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*first == cur) 12269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((total % 256) == 0) && 12271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 12272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodesExt(*first, cur) >= 0)) 12273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 12274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodes(*first, cur) >= 0)) 12275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((last != NULL) && (*last != NULL)) { 12281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*last == cur) 12282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((total % 256) == 0) && 12284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 12285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodesExt(cur, *last) >= 0)) 12286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 12287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodes(cur, *last) >= 0)) 12288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total++; 12295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " %s", cur->name); 12298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1229960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (test) { 12301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NONE: 12302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 0; 12303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE 12304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 12305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_TYPE: 12306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Don't we need to use 12308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddNs() for namespace nodes here? 12309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Surprisingly, some c14n tests fail, if we do this. 12310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NODE_TYPE_NODE) { 12312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 12313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 12314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 12315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 12316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 12317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1231860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_ELEMENT_NODE: 12319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 12320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 12321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 12322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 12323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 12324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 12325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == type) { 12331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_NAMESPACE_DECL) 12332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT_NS 12333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 12334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((type == NODE_TYPE_TEXT) && 12336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE)) 12337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_PI: 12342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_PI_NODE) && 12343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((name == NULL) || xmlStrEqual(name, cur->name))) 12344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_ALL: 12349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (axis == AXIS_ATTRIBUTE) { 12350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ATTRIBUTE_NODE) 12351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (axis == AXIS_NAMESPACE) { 12355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_NAMESPACE_DECL) 12356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT_NS 12358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 12361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 12362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->ns != NULL) && 12366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(URI, cur->ns->href))) 12367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NS:{ 12374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 12375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NAME: 12378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (axis == AXIS_ATTRIBUTE) { 12379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_ATTRIBUTE_NODE) 12380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (axis == AXIS_NAMESPACE) { 12382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_NAMESPACE_DECL) 12383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_ELEMENT_NODE) 12386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 12389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 12390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, cur->name)) { 12391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) { 12392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns == NULL) 12393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && 12398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(URI, cur->ns->href))) 12399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE:{ 12406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr = (xmlAttrPtr) cur; 12407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, attr->name)) { 12409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) { 12410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->ns == NULL) || 12411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->ns->prefix == NULL)) 12412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->ns != NULL) && 12417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(URI, 12418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->ns->href))) 12419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 12427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_NAMESPACE_DECL) { 12428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) cur; 12429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->prefix != NULL) && (name != NULL) 12431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(ns->prefix, name))) 12432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT_NS 12434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } /* switch(test) */ 12442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 12443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto apply_predicates; 12445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1244660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottaxis_range_end: /* ----------------------------------------------------- */ 12447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We have a "/foo[n]", and position() = n was reached. 12449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that we can have as well "/foo/::parent::foo[1]", so 12450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a duplicate-aware merge is still needed. 12451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merge with the result. 12452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 0); 12458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Break if only a true/false result was requested. 12460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 12462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 12464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfirst_hit: /* ---------------------------------------------------------- */ 12466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Break if only a true/false result was requested and 12468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * no predicates existed and a node test succeeded. 12469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 0); 12475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq != NULL) 12479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbMatches += seq->nodeNr; 12480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectapply_predicates: /* --------------------------------------------------- */ 12483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Apply predicates. 1248560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 12486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((predOp != NULL) && (seq->nodeNr > 0)) { 12487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E.g. when we have a "/foo[some expression][n]". 1248960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 12490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: The old predicate evaluation took into 12492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * account location-sets. 12493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (E.g. ctxt->value->type == XPATH_LOCATIONSET) 12494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do we expect such a set here? 12495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All what I learned now from the evaluation semantics 12496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * does not indicate that a location-set will be processed 12497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here, so this looks OK. 1249860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 12499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Iterate over all predicates, starting with the outermost 12501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * predicate. 12502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Problem: we cannot execute the inner predicates first 12503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * since we cannot go back *up* the operator tree! 12504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Options we have: 12505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1) Use of recursive functions (like is it currently done 12506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * via xmlXPathCompOpEval()) 12507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2) Add a predicate evaluation information stack to the 12508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context struct 12509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3) Change the way the operators are linked; we need a 12510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "parent" field on xmlXPathStepOp 12511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For the moment, I'll try to solve this with a recursive 12513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function: xmlXPathCompOpEvalPredicate(). 1251460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 12515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = seq->nodeNr; 12516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasPredicateRange != 0) 12517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt, 12518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp, seq, size, maxPos, maxPos, hasNsNodes); 12519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 12520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newSize = xmlXPathCompOpEvalPredicate(ctxt, 12521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp, seq, size, hasNsNodes); 12522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 12524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 0; 12525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 12526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the filtered set of nodes to the result node set. 12529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newSize == 0) { 12531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The predicates filtered all nodes out. 12533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(seq, hasNsNodes); 12535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (seq->nodeNr > 0) { 12536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add to result set. 12538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size != newSize) { 12541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We need to merge and clear here, since 12543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the sequence will contained NULLed entries. 12544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(NULL, seq, 1); 12546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 12552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size != newSize) ? 1: 0); 12553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Break if only a true/false result was requested. 12555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 12557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (seq->nodeNr > 0) { 12560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add to result set. 12562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 0); 12568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1256960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 12573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->boolval) && (obj->user != NULL)) { 12574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: What does this do and why? 12576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Do we have to do this also for the "error" 12577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * cleanup further down? 12578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->boolval = 1; 12580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->user = obj->user; 12581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->user = NULL; 12582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->boolval = 0; 12583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 12585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Ensure we return at least an emtpy set. 12588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((seq != NULL) && (seq->nodeNr == 0)) 12591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 12593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = xmlXPathNodeSetCreate(NULL); 1259460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* XXX what if xmlXPathNodeSetCreate returned NULL here? */ 12595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((seq != NULL) && (seq != outSeq)) { 12597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(seq); 1259860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Hand over the result. Better to push the set also in 12601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of errors. 12602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq)); 12604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset the context node. 12606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = oldContextNode; 12608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 12611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "\nExamined %d nodes, found %d nodes at that step\n", 12612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total, nbMatches); 12613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(total); 12616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 12617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, 12620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr * first); 12621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 12623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalFirst: 12624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 12625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an XPath compiled operation 12626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @first: the first elem found so far 12627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the first 12629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order 12630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of examined objects. 12632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, 12635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr * first) 12636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 12637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0, cur; 12638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 12639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 12640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 12643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 12644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 12645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 12647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 12648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], 12649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first); 12650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr >= 1)) { 12655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * limit tree traversing to first node in the result 12657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: This implicitely sorts 12660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result, even if not needed. E.g. if the argument 12661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the count() function, no sorting is needed. 12662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: How do we know if the node-list wasn't 12663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * aready sorted? 12664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->nodesetval->nodeNr > 1) 12666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = ctxt->value->nodesetval->nodeTab[0]; 12668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = 12670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2], 12671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first); 12672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 12675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 12678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, 12680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2->nodesetval); 12681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 12682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 12683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* optimizer */ 12684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (total > cur) 12685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompSwap(op); 12686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total + cur); 12687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 12688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoot(ctxt); 12689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 12691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 12698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 12699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 12701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT:{ 12710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 12711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0); 12717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 12720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 12721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 12722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathObjectPtr) op->value4)); 12723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 12725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], 12728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first); 12729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr > 1)) 12734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST 12737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FILTER: 12738df143a5041f03a22808b59c76698770b74692815Selim Gurun total += xmlXPathCompOpEvalFilterFirst(ctxt, op, first); 12739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlXPathCompOpEval(ctxt, op)); 12743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 12745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 12747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalLast: 12748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 12749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an XPath compiled operation 12750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @last: the last elem found so far 12751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the last 12753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order 12754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed 12756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, 12759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr * last) 12760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 12761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0, cur; 12762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 12763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 12764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr bak; 12765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr bakd; 12766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int pp; 12767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cs; 12768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 12771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 12772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 12773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 12775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 12776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 12777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 12778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 12779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 12780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last); 12781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr >= 1)) { 12786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * limit tree traversing to first node in the result 12788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->nodesetval->nodeNr > 1) 12790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *last = 12792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[ctxt->value-> 12793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodesetval->nodeNr - 12794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1]; 12795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 12797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 12798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 12799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 12800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = 12801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last); 12802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */ 12807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 12810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 12813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, 12815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2->nodesetval); 12816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 12817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 12818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* optimizer */ 12819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (total > cur) 12820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompSwap(op); 12821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total + cur); 12822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 12823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoot(ctxt); 12824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 12826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 12833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 12834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 12836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT:{ 12845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 12846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0); 12852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 12855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 12856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 12857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathObjectPtr) op->value4)); 12858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 12860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], 12863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last); 12864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr > 1)) 12869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlXPathCompOpEval(ctxt, op)); 12873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 12875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST 12877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, 12879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr * first) 12880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 12881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0; 1288260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathCompExprPtr comp; 12883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res; 1288460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathObjectPtr obj; 12885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr oldset; 12886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldnode; 12887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldDoc; 12888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 12889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 12892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for ()[last()] selection i.e. the last elem 12894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->ch1 != -1) && (op->ch2 != -1) && 12896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_SORT) && 12897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch2].op == XPATH_OP_SORT)) { 12898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f = comp->steps[op->ch2].ch1; 1289960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != -1) && 12901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].op == XPATH_OP_FUNCTION) && 12902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value5 == NULL) && 12903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value == 0) && 12904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4 != NULL) && 12905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 12906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4, BAD_CAST "last"))) { 12907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr last = NULL; 1290860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, 12911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], 12912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &last); 12913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The nodeset should be in document order, 12916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Keep only the last value 12917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 12919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 12920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 12921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeTab != NULL) && 12922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) { 12923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[0] = 12924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[ctxt-> 12925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value-> 12926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodesetval-> 12927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeNr - 12928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1]; 12929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeNr = 1; 12930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = *(ctxt->value->nodesetval->nodeTab); 12931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1293560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) 12940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 12942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 1294360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 12945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 12946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Hum are we filtering the result of an XPointer expression 12948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type == XPATH_LOCATIONSET) { 12950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp = NULL; 12951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr newlocset = NULL; 12952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr oldlocset; 1295360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old locset, and then evaluate the result of the 12956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the locset. use it to grow 12957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new locset. 12958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_LOCATIONSET); 12960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 12961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset = obj->user; 12962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 1296360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { 12965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 12966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 12967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 12970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 12971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 12972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 12974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 1297860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 12979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldlocset->locNr; i++) { 12980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a 12982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * single item in the nodelocset. 12983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldlocset->locTab[i]->user; 12985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldlocset->locNr; 12986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 12987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 12988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 12989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 12990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(tmp->nodesetval, 12992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 1299360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 12994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 12995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 12998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 12999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation need to be tested to 13003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decided whether the filter succeeded or not 13004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, 13008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 13009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset->locTab[i])); 13010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 1301960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathNodeSetClear(tmp->nodesetval, 1); 13020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * REVISIT TODO: Don't create a temporary nodeset 13022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for everly iteration. 13023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OLD: xmlXPathFreeObject(res); */ 13025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 1302660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tmp = NULL; 13027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only put the first node in the result, then leave. 13030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newlocset->locNr > 0) { 13032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = (xmlNodePtr) oldlocset->locTab[i]->user; 13033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 13034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 13037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, tmp); 13038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation locset. 13041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); 13047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 1305160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 13052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old set, and then evaluate the result of the 13054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the set. use it to grow 13055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new set. 13056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldset = obj->nodesetval; 1306060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 13061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 13062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldDoc = ctxt->context->doc; 13063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 1306460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 13065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset == NULL) || (oldset->nodeNr == 0)) { 13066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* QUESTION TODO: Why was this code commented out? 13069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) 13076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(res); 13077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr newset; 13083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp = NULL; 13084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the new set. 13086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 13087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() evaluation are attempted on the predicate 1308860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 13089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newset = xmlXPathNodeSetCreate(NULL); 1309060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* XXX what if xmlXPathNodeSetCreate returned NULL? */ 1309160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 13092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldset->nodeNr; i++) { 13093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of 13095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a single item in the nodeset. 13096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldset->nodeTab[i]; 13098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && 13099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (oldset->nodeTab[i]->doc != NULL)) 13100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldset->nodeTab[i]->doc; 13101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 13102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(tmp->nodesetval, 13106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldset->nodeNr; 13110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(newset); 13115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1311760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 13118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation needs to be tested to 13120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decide whether the filter succeeded or not 13121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]); 1312560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 13126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 13134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary nodeset 13136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in order to avoid massive recreation inside this 13137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * loop. 13138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(tmp->nodesetval, 1); 13140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 13141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 13142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only put the first node in the result, then leave. 13145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newset->nodeNr > 0) { 13147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = *(newset->nodeTab); 13148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 13149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 13152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, tmp); 13153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation set. 13156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* may want to move this past the '}' later */ 13162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldDoc; 13163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset)); 13164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(total); 13167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 13168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_FILTER_FIRST */ 13169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 13171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEval: 13172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 13173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an XPath compiled operation 13174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation 13176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed 13177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 13179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op) 13180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 13181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0; 13182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int equal, ret; 13183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 13184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 13185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr bak; 13186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr bakd; 13187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int pp; 13188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cs; 13189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 13192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 13193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 13194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 13195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_AND: 13196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || (ctxt->value->boolval == 0)) 13204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 13206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error) { 13212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 13213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 13217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->boolval &= arg2->boolval; 13218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 13219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 13220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_OR: 13222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || (ctxt->value->boolval == 1)) 13230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 13232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error) { 13238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 13239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 13243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->boolval |= arg2->boolval; 13244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 13245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 13246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_EQUAL: 13248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value) 1326160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott equal = xmlXPathEqualValues(ctxt); 13262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 13263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project equal = xmlXPathNotEqualValues(ctxt); 13264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal)); 13265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_CMP: 13267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareValues(ctxt, op->value, op->value2); 13280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); 13281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PLUS: 13283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 13290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 13298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubValues(ctxt); 13299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 13300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAddValues(ctxt); 13301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 2) 13302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathValueFlipSign(ctxt); 13303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 3) { 13304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 13305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NUMBER); 13306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_MULT: 13309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 13322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathMultValues(ctxt); 13323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 13324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDivValues(ctxt); 13325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 2) 13326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathModValues(ctxt); 13327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 13329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 13343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 13346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->nodesetval == NULL) || 13348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg2->nodesetval != NULL) && 13349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2->nodesetval->nodeNr != 0))) 13350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 13351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, 13352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2->nodesetval); 13353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 13356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 13357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 13359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoot(ctxt); 13360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 13362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 13369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 13370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 13372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT:{ 13381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 13382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0); 13388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 13391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 13392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 13393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathObjectPtr) op->value4)); 13394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VARIABLE:{ 13396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val; 13397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value5 == NULL) { 13402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathVariableLookup(ctxt->context, op->value4); 13403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 13404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; 13405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, val); 13408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URI; 13410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlXPathNsLookup(ctxt->context, op->value5); 13412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 13413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1341460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n", 1341560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (char *) op->value4, (char *)op->value5); 13416df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->error = XPATH_UNDEF_PREFIX_ERROR; 13417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathVariableLookupNS(ctxt->context, 13420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4, URI); 13421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 13422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; 13423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, val); 13426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FUNCTION:{ 13430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction func; 13431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *oldFunc, *oldFuncURI; 13432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 13433df143a5041f03a22808b59c76698770b74692815Selim Gurun int frame; 13434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13435df143a5041f03a22808b59c76698770b74692815Selim Gurun frame = xmlXPathSetFrame(ctxt); 13436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueNr < op->value) { 13440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: parameter error\n"); 13442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_INVALID_OPERAND; 13443df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathPopFrame(ctxt, frame); 13444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13446df143a5041f03a22808b59c76698770b74692815Selim Gurun for (i = 0; i < op->value; i++) { 13447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) { 13448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: parameter error\n"); 13450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_INVALID_OPERAND; 13451df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathPopFrame(ctxt, frame); 13452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13454df143a5041f03a22808b59c76698770b74692815Selim Gurun } 13455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->cache != NULL) 13456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_CAST_FPTR(func) = op->cache; 13457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 13458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URI = NULL; 13459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value5 == NULL) 13461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project func = 13462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunctionLookup(ctxt->context, 13463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4); 13464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 13465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlXPathNsLookup(ctxt->context, op->value5); 13466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 13467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1346860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n", 1346960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (char *)op->value4, (char *)op->value5); 13470df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathPopFrame(ctxt, frame); 13471df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->error = XPATH_UNDEF_PREFIX_ERROR; 13472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project func = xmlXPathFunctionLookupNS(ctxt->context, 13475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4, URI); 13476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (func == NULL) { 13478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1347960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlXPathCompOpEval: function %s not found\n", 1348060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (char *)op->value4); 13481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR); 13482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->cache = XML_CAST_FPTR(func); 13484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->cacheURI = (void *) URI; 13485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldFunc = ctxt->context->function; 13487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldFuncURI = ctxt->context->functionURI; 13488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->function = op->value4; 13489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->functionURI = op->cacheURI; 13490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project func(ctxt, op->value); 13491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->function = oldFunc; 13492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->functionURI = oldFuncURI; 13493df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlXPathPopFrame(ctxt, frame); 13494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ARG: 13497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 13509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PREDICATE: 13516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FILTER:{ 13517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res; 13518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj, tmp; 13519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr newset = NULL; 13520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr oldset; 13521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldnode; 13522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldDoc; 13523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 13524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for ()[1] selection i.e. the first elem 13527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->ch1 != -1) && (op->ch2 != -1) && 13529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST 13530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * FILTER TODO: Can we assume that the inner processing 13532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will result in an ordered list if we have an 13533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPATH_OP_FILTER? 13534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * What about an additional field or flag on 13535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathObject like @sorted ? This way we wouln'd need 13536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to assume anything, so it would be more robust and 13537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * easier to optimize. 13538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */ 13540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */ 13541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 13542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_SORT) && 13543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 13544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */ 13545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val; 13546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = comp->steps[op->ch2].value4; 13548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val != NULL) && (val->type == XPATH_NUMBER) && 13549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val->floatval == 1.0)) { 13550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr first = NULL; 13551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, 13554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], 13555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &first); 13556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The nodeset should be in document order, 13559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Keep only the first value 13560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 13562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 13563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 13564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) 13565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeNr = 1; 13566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for ()[last()] selection i.e. the last elem 13571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->ch1 != -1) && (op->ch2 != -1) && 13573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_SORT) && 13574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch2].op == XPATH_OP_SORT)) { 13575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f = comp->steps[op->ch2].ch1; 13576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != -1) && 13578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].op == XPATH_OP_FUNCTION) && 13579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value5 == NULL) && 13580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value == 0) && 13581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4 != NULL) && 13582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 13583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4, BAD_CAST "last"))) { 13584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr last = NULL; 13585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, 13588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], 13589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &last); 13590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The nodeset should be in document order, 13593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Keep only the last value 13594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 13596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 13597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 13598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeTab != NULL) && 13599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) { 13600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[0] = 13601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[ctxt-> 13602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value-> 13603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodesetval-> 13604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeNr - 13605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1]; 13606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeNr = 1; 13607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process inner predicates first. 13613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example "index[parent::book][1]": 13614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ... 13615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE <-- we are here "[1]" 13616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE <-- process "[parent::book]" first 13617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SORT 13618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COLLECT 'parent' 'name' 'node' book 13619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NODE 13620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ELEM Object is a number : 1 13621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) 13627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 13629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 13632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 13634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Hum are we filtering the result of an XPointer expression 13636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type == XPATH_LOCATIONSET) { 13638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr newlocset = NULL; 13639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr oldlocset; 13640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old locset, and then evaluate the result of the 13643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the locset. use it to grow 13644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new locset. 13645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_LOCATIONSET); 13647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset = obj->user; 13649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { 13652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 13667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldlocset->locNr; i++) { 13669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a 13671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * single item in the nodelocset. 13672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldlocset->locTab[i]->user; 13674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldlocset->locNr; 13675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 1367960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 13680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation need to be tested to 13691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decided whether the filter succeeded or not 13692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, 13696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectCopy 13697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (oldlocset->locTab[i])); 13698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation locset. 13716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); 13722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 13726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old set, and then evaluate the result of the 13729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the set. use it to grow 13730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new set. 13731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldset = obj->nodesetval; 13735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 13737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldDoc = ctxt->context->doc; 13738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset == NULL) || (oldset->nodeNr == 0)) { 13741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 13744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) 13751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(res); 13752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 13753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 13758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the new set. 13760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 13761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() evaluation are attempted on the predicate 13762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newset = xmlXPathNodeSetCreate(NULL); 13764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 13766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "For each node in the node-set to be filtered, the 13767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PredicateExpr is evaluated with that node as the 13768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, with the number of nodes in the 13769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set as the context size, and with the proximity 13770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * position of the node in the node-set with respect to 13771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the axis as the context position;" 13772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @oldset is the node-set" to be filtered. 13773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 13775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "only predicates change the context position and 13776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context size (see [2.4 Predicates])." 13777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example: 13778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 13779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nA 1 13780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 2 13781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 3 13782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * After applying predicate [position() > 1] : 13783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 13784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 1 13785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 2 13786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * removed the first node in the node-set, then 1378860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * the context position of the 13789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldset->nodeNr; i++) { 13791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of 13793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a single item in the nodeset. 13794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldset->nodeTab[i]; 13796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && 13797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (oldset->nodeTab[i]->doc != NULL)) 13798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldset->nodeTab[i]->doc; 13799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 13800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(tmp->nodesetval, 13804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldset->nodeNr; 13808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the predicate against the context node. 13811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Can/should we optimize position() predicates 13812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here (e.g. "[1]")? 13813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(newset); 13820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation needs to be tested to 13826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decide whether the filter succeeded or not 13827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: Can we use 13830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAdd*Unique()* instead? 13831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]); 13835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 1384560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathNodeSetClear(tmp->nodesetval, 1); 13846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary nodeset 13848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in order to avoid massive recreation inside this 13849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * loop. 13850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 13852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 13853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) 13856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, tmp); 13857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation set. 13859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* may want to move this past the '}' later */ 13865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldDoc; 13866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 13867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheWrapNodeSet(ctxt->context, newset)); 13868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 13873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 13877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 13878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 13879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) 13880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 13881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 13882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 13885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RANGETO:{ 13886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr range; 13887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res, obj; 13888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp; 13889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr newlocset = NULL; 13890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr oldlocset; 13891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr oldset; 13892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 13893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) 13898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type == XPATH_LOCATIONSET) { 13901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old locset, and then evaluate the result of the 13903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the locset. use it to grow 13904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new locset. 13905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_LOCATIONSET); 13907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset = obj->user; 13909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { 13911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]); 13915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 13924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldlocset->locNr; i++) { 13926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a 13928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * single item in the nodelocset. 13929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldlocset->locTab[i]->user; 13931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldlocset->locNr; 13932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->type == XPATH_LOCATIONSET) { 1394860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlLocationSetPtr rloc = 13949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlLocationSetPtr)res->user; 13950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j=0; j<rloc->locNr; j++) { 13951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = xmlXPtrNewRange( 13952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset->locTab[i]->user, 13953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset->locTab[i]->index, 13954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rloc->locTab[j]->user2, 13955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rloc->locTab[j]->index2); 13956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range != NULL) { 13957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, range); 13958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = xmlXPtrNewRangeNodeObject( 13962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr)oldlocset->locTab[i]->user, res); 13963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range != NULL) { 13964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset,range); 13965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { /* Not a location set */ 13982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldset = obj->nodesetval; 13985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 13988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldset != NULL) { 13990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldset->nodeNr; i++) { 13991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a single item 13993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the nodeset. 13994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldset->nodeTab[i]; 13996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: Avoid recreation for every iteration. 13998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 14000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 14001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 14002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 14004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 14005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 14006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 14007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 14008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 14009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 14013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = 14014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], 14015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res); 14016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range != NULL) { 14017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, range); 14018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 14022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 14024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 14025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 14027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 14028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 14029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 14032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation set. 14038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 14040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 14041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 14042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 14043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); 14044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 14045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 14047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "XPath: unknown precompiled operation %d\n", op->op); 14050df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->error = XPATH_INVALID_OPERAND; 14051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 14052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalToBoolean: 14056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context 14057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if the expression evaluates to true. 14059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if false and -1 on API or internal errors. 14061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, 14064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 14065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isPredicate) 14066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr resObj = NULL; 14068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstart: 14070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* comp = ctxt->comp; */ 14071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 14072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 14073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 14074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 14075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project resObj = (xmlXPathObjectPtr) op->value4; 14076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (isPredicate) 14077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathEvaluatePredicateResult(ctxt, resObj)); 14078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCastToBoolean(resObj)); 14079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 14080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't need sorting for boolean results. Skip this one. 14082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 14084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &ctxt->comp->steps[op->ch1]; 14085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto start; 14086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT: 14089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 14090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]); 14093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) 14094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1); 14097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) 14098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project resObj = valuePop(ctxt); 14101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj == NULL) 14102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to call xmlXPathCompOpEval(). 14107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, op); 14109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) 14110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1411160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project resObj = valuePop(ctxt); 14113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj == NULL) 14114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj) { 14119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 14120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj->type == XPATH_BOOLEAN) { 14122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = resObj->boolval; 14123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (isPredicate) { 14124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For predicates a result of type "number" is handled 14126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * differently: 14127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 14128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "If the result is a number, the result will be converted 14129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to true if the number is equal to the context position 14130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and will be converted to false otherwise;" 14131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1413260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott res = xmlXPathEvaluatePredicateResult(ctxt, resObj); 14133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastToBoolean(resObj); 14135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, resObj); 14137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunStreamEval: 14146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 14147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled Streamable XPath expression in the given context. 14149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp, 14152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr *resultSeq, int toBool) 14153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max_depth, min_depth; 1415560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int from_root; 14156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret, depth; 14157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int eval_all_nodes; 14158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur = NULL, limit = NULL; 14159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtPtr patstream = NULL; 1416060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1416160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int nb_nodes = 0; 14162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (comp == NULL)) 14164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max_depth = xmlPatternMaxDepth(comp); 14166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max_depth == -1) 14167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max_depth == -2) 14169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max_depth = 10000; 14170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min_depth = xmlPatternMinDepth(comp); 14171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min_depth == -1) 14172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from_root = xmlPatternFromRoot(comp); 14174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root < 0) 14175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 14177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("stream eval: depth %d from root %d\n", max_depth, from_root); 14178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! toBool) { 14181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resultSeq == NULL) 14182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL); 14184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*resultSeq == NULL) 14185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1418760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * handle the special cases of "/" amd "." being matched 14190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min_depth == 0) { 14192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root) { 14193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Select "/" */ 14194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, 14197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr) ctxt->doc); 14198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Select "self::node()" */ 14200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node); 14203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max_depth == 0) { 14206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root) { 14210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlNodePtr)ctxt->doc; 14211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->node != NULL) { 14212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->node->type) { 14213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 14214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 14215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 14216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 14217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 14218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 14219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->node; 14221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 14223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 14224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 14225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 14226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 14227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 14228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 14229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 14230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 14231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 14232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 14233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 14234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 14235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 14236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 14237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 14238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project limit = cur; 14241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 14243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project patstream = xmlPatternGetStreamCtxt(comp); 14247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patstream == NULL) { 14248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: Is this an error? 14250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project eval_all_nodes = xmlStreamWantsAnyNode(patstream); 14255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root) { 14257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPush(patstream, NULL, NULL); 14258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 14259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 14260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto return_1; 14262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); 14263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth = 0; 14266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto scan_children; 14267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_node: 14268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_nodes++; 14270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 14272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 14273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 14274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 14275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 14276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 14277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 14278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPush(patstream, cur->name, 14279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->ns ? cur->ns->href : NULL)); 14280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (eval_all_nodes) 14281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type); 14282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 14283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1428460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 14286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* NOP. */ 14287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 14288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto return_1; 14290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); 14291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children == NULL) || (depth >= max_depth)) { 14293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPop(patstream); 14294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 14295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 14296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 14297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 14298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_node; 14299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectscan_children: 14306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children != NULL) && (depth < max_depth)) { 14307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1430860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Do not descend on entities declarations 14309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children->type != XML_ENTITY_DECL) { 14311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 14312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth++; 14313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip DTDs 14315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_DTD_NODE) 14317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 14318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == limit) 14322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 14325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 14326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 14327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 14328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_node; 14329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1433060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 14333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth--; 14334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur == limit)) 14335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 14336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 14337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPop(patstream); 14338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((eval_all_nodes) && 14339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->type == XML_TEXT_NODE) || 14340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE) || 14341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_COMMENT_NODE) || 14342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_PI_NODE))) 14343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPop(patstream); 14345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 14347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 14348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 14351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((cur != NULL) && (depth >= 0)); 14353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 14355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 14357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("stream eval: checked %d nodes selected %d\n", 14358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_nodes, retObj->nodesetval->nodeNr); 14359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patstream) 14362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamCtxt(patstream); 14363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectreturn_1: 14366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patstream) 14367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamCtxt(patstream); 14368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */ 14371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunEval: 14374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 14375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool: evaluate to a boolean result 14376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context. 14378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool) 14381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->comp == NULL)) 14385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab == NULL) { 14388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the value stack */ 1438960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->valueTab = (xmlXPathObjectPtr *) 14390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); 14391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab == NULL) { 14392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathPErrMemory(ctxt, "creating evaluation context\n"); 14393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 14394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueNr = 0; 14396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueMax = 10; 14397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = NULL; 14398df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->valueFrame = 0; 14399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp->stream) { 14402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 14403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) { 14405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluation to boolean result. 14407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathRunStreamEval(ctxt->context, 14409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->stream, NULL, 1); 14410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != -1) 14411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1441360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathObjectPtr resObj = NULL; 14414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluation to a sequence. 14417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathRunStreamEval(ctxt->context, 14419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->stream, &resObj, 0); 14420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((res != -1) && (resObj != NULL)) { 14422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, resObj); 14423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj != NULL) 1442660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathReleaseObject(ctxt->context, resObj); 14427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: This falls back to normal XPath evaluation 14430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if res == -1. Is this intended? 14431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 14435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->last < 0) { 14436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathRunEval: last is less than zero\n"); 14438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompOpEvalToBoolean(ctxt, 14442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[comp->last], 0)); 14443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 14444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]); 14445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 14450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1445160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Public interfaces * 14452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 14453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 14454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalPredicate: 14457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res: the Predicate Expression evaluation result 14459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node. 14461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting 14462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will 14463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the 14464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position 14465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result 14466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call 1446760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * to the boolean function. 14468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise 14470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 14472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) { 14473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (res == NULL)) return(0); 14474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (res->type) { 14475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 14476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->boolval); 14477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 14478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->floatval == ctxt->proximityPosition); 14479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 14480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 14481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->nodesetval == NULL) 14482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->nodesetval->nodeNr != 0); 14484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 14485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((res->stringval != NULL) && 14486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrlen(res->stringval) != 0)); 14487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE 14489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvaluatePredicateResult: 14495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 14496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res: the Predicate Expression evaluation result 14497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node. 14499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting 14500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will 14501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the 14502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position 14503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result 14504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call 1450560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * to the boolean function. 14506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise 14508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1451060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt, 14511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res) { 14512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (res == NULL)) return(0); 14513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (res->type) { 14514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 14515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->boolval); 14516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 14517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200)) 14518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((res->floatval == ctxt->context->proximityPosition) && 14519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/ 14520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 14521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->floatval == ctxt->context->proximityPosition); 14522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 14524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 14525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->nodesetval == NULL) 14526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->nodesetval->nodeNr != 0); 14528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 14529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((res->stringval != NULL) && (res->stringval[0] != 0)); 14530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 14531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET:{ 14532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr ptr = res->user; 14533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ptr == NULL) 14534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ptr->locNr != 0); 14536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE 14540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTryStreamCompile: 14547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context 14548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the XPath expression as a streamable subset. 14551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL if failed to compile. 14553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr 14555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { 14556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization: use streaming patterns when the XPath expression can 14558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be compiled to a stream lookup 14559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr stream; 14561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 14563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces = NULL; 14564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 14565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 14566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) && 14568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrchr(str, '@'))) { 14569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 14570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't try to handle expressions using the verbose axis 14573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specifiers ("::"), just the simplied form at this point. 14574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Additionally, if there is no list of namespaces available and 14575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there's a ":" in the expression, indicating a prefixed QName, 14576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then we won't try to compile either. xmlPatterncompile() needs 14577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to have a list of namespaces at compilation time in order to 14578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compile prefixed name tests. 14579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlStrchr(str, ':'); 14581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && 14582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':'))) 1458360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 14584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 14586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = ctxt->dict; 14587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsNr > 0) { 14588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*)); 14589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (namespaces == NULL) { 14590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "allocating namespaces array\n"); 14591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0, j = 0; (j < ctxt->nsNr); j++) { 14594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ctxt->namespaces[j]; 14595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = ns->href; 14596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = ns->prefix; 14597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = NULL; 14599df143a5041f03a22808b59c76698770b74692815Selim Gurun namespaces[i] = NULL; 14600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH, 14604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &namespaces[0]); 14605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (namespaces != NULL) { 14606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **)namespaces); 1460760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 14608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) { 14609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathNewCompExpr(); 14610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) { 14611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "allocating streamable expression\n"); 14612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->stream = stream; 14615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->dict = dict; 14616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict) 14617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(comp->dict); 14618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp); 14619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePattern(stream); 14621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */ 14625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCanRewriteDosExpression(xmlChar *expr) 14628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expr == NULL) 14630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*expr == '/') && (*(++expr) == '/')) 14633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*expr++); 14635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 14638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRewriteDOSExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op) 14639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to rewrite "descendant-or-self::node()/foo" to an optimized 14642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal representation. 14643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 14645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->op == XPATH_OP_COLLECT /* 11 */) && 1464660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((xmlXPathAxisVal) op->value == AXIS_CHILD /* 4 */) && 14647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTestVal) op->value2 == NODE_TEST_NAME /* 5 */) && 14648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTypeVal) op->value3 == NODE_TYPE_NODE /* 0 */)) 14649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a "child::foo" 14652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1465360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathStepOpPtr prevop = &comp->steps[op->ch1]; 14654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prevop->op == XPATH_OP_COLLECT /* 11 */) && 1465660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (prevop->ch1 != -1) && 14657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathAxisVal) prevop->value == 14658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_DESCENDANT_OR_SELF) && 14659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prevop->ch2 == -1) && 14660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) && 14661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE) && 14662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[prevop->ch1].op == XPATH_OP_ROOT)) 1466360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott { 14664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a "/descendant-or-self::node()" without predicates. 14666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate it. 14667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->ch1 = prevop->ch1; 1466960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott op->rewriteType = XP_REWRITE_DOS_CHILD_ELEM; 14670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 14673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch1]); 14674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 14676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch2]); 14677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCtxtCompile: 14681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context 14682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression 14685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. 14687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr 14690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { 14691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr pctxt; 14692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathTryStreamCompile(ctxt, str); 14696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) 14697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp); 14698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlXPathNewParserContext(str, ctxt); 14703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt == NULL) 14704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 14705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(pctxt, 1); 14706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if( pctxt->error != XPATH_EXPRESSION_OK ) 14708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*pctxt->cur != 0) { 1471460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 14715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * aleksey: in some cases this line prints *second* error message 14716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see bug #78858) and probably this should be fixed. 14717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * However, we are not sure that all error messages are printed 14718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * out in other places. It's not critical so we leave it as-is for now 14719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); 14721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = NULL; 14722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = pctxt->comp; 14724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt->comp = NULL; 14725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) { 14729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->expr = xmlStrdup(str); 14730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 14731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->string = xmlStrdup(str); 14732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nb = 0; 1473360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif 14734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->expr != NULL) && 14735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->nbStep > 2) && 14736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->last >= 0) && 14737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCanRewriteDosExpression(comp->expr) == 1)) 14738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(comp, &comp->steps[comp->last]); 14740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp); 14743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompile: 14747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression 14750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. 14752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr 14755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompile(const xmlChar *str) { 14756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCtxtCompile(NULL, str)); 14757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalInternal: 14761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled XPath expression 14762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @resObj: the resulting XPath object or NULL 14764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool: 1 if only a boolean result is requested 14765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context. 14767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free @resObj. 14768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp, 14774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr ctxt, 14775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr *resObj, 14776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int toBool) 14777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1477860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathParserContextPtr pctxt; 14779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 14780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static int reentance = 0; 14781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 14783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_CTXT_NEG(ctxt) 14785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 14787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 14791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reentance++; 14792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (reentance > 1) 14793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDisableOptimizer = 1; 14794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 14797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nb++; 14798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->string != NULL) && (comp->nb > 100)) { 14799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "100 x %s\n", comp->string); 14800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nb = 0; 14801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlXPathCompParserContext(comp, ctxt); 14804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathRunEval(pctxt, toBool); 14805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj) { 1480760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (pctxt->value == NULL) { 14808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompiledEval: evaluation failed\n"); 1481060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *resObj = NULL; 14811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resObj = valuePop(pctxt); 14813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1481560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop all remaining objects from the stack. 14818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt->valueNr > 0) { 14820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp; 14821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stack = 0; 14822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(pctxt); 14825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 1482660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott stack++; 14827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, tmp); 14828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 14830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stack != 0) && 14831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((toBool) || ((resObj) && (*resObj)))) 14832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompiledEval: %d objects left on the stack.\n", 14835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack); 14836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1483860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) { 14840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(*resObj); 14841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resObj = NULL; 1484260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 14843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt->comp = NULL; 14844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 14846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reentance--; 14847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEval: 14854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled XPath expression 14855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the XPath context 14856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context. 14858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 14863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx) 14864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res = NULL; 14866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompiledEvalInternal(comp, ctx, &res, 0); 14868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalToBoolean: 14873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled XPath expression 14874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the XPath boolean() function on the result of the given 14877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compiled expression. 14878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the expression evaluated to true, 0 if to false and 14880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -1 in API and internal errors. 14881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 14883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, 14884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr ctxt) 14885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1)); 14887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpr: 14891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 14892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate an XPath expression in the given context, 14894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then push the result on the context stack 14895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 14897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) { 14898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 1490360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 14904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base); 14906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) { 14907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp != NULL) 14908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCompExpr(ctxt->comp); 14909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp = comp; 14910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cur != NULL) 14911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*ctxt->cur != 0) ctxt->cur++; 14912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 14913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 14916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In this scenario the expression string will sit in ctxt->base. 14918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->error == XPATH_EXPRESSION_OK) && 14920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->comp != NULL) && 14921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->base != NULL) && 14922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->comp->nbStep > 2) && 14923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->comp->last >= 0) && 14924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCanRewriteDosExpression((xmlChar *) ctxt->base) == 1)) 14925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(ctxt->comp, 14927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &ctxt->comp->steps[ctxt->comp->last]); 14928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 1493160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlXPathRunEval(ctxt, 0); 14932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEval: 14936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the XPath context 14938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath Location Path in the given context. 14940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 14945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) { 14946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr ctxt; 14947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res, tmp, init = NULL; 14948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stack = 0; 14949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_CTXT(ctx) 14951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlXPathNewParserContext(str, ctx); 14955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 14956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 14957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathEvalExpr(ctxt); 14958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) { 14960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathEval: evaluation failed\n"); 14962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 1496360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL) 14964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->comp->stream == NULL) 14966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) { 14968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); 14969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 14970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 14972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(ctxt); 14976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 14977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != init) 14978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack++; 14979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctx, tmp); 14980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 14982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stack != 0) && (res != NULL)) { 14983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathEval: %d object left on the stack\n", 14985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack); 14986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 14988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(res); 14989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 14990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(ctxt); 14993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpression: 14998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 15000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath expression in the given context. 15002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 15004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 15005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 15006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 15007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) { 15008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr pctxt; 15009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res, tmp; 15010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stack = 0; 15011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_CTXT(ctxt) 15013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 15015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlXPathNewParserContext(str, ctxt); 15017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt == NULL) 15018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 15019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathEvalExpr(pctxt); 15020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) { 15022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); 15023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 15024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 15025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(pctxt); 15026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 15028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(pctxt); 15029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 15030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, tmp); 15031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack++; 15032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 15034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stack != 0) && (res != NULL)) { 15035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 15036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathEvalExpression: %d object left on the stack\n", 15037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack); 15038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 15040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 15041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 15042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 15044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 15045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extra functions not pertaining to the XPath spec * 15046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 15047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 15048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 15049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEscapeUriFunction: 15050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 15051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 15052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the escape-uri() XPath function 15054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string escape-uri(string $str, bool $escape-reserved) 15055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function applies the URI escaping rules defined in section 2 of [RFC 15057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2396] to the string supplied as $uri-part, which typically represents all 15058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or part of a URI. The effect of the function is to replace any special 15059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string by an escape sequence of the form %xx%yy..., 15060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * where xxyy... is the hexadecimal representation of the octets used to 15061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * represent the character in UTF-8. 15062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The set of characters that are escaped depends on the setting of the 15064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean argument $escape-reserved. 15065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is true, all characters are escaped other than lower 15067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case letters a-z, upper case letters A-Z, digits 0-9, and the characters 15068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!" 15069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only 15070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and 15071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A-F). 15072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is false, the behavior differs in that characters 15074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as reserved characters are not escaped. These 15075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",". 1507660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 15077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [RFC 2396] does not define whether escaped URIs should use lower case or 15078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upper case for hexadecimal digits. To ensure that escaped URIs can be 15079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compared using string comparison functions, this function must always use 15080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the upper-case letters A-F. 1508160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 15082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generally, $escape-reserved should be set to true when escaping a string 15083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is to form a single part of a URI, and to false when escaping an 15084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entire URI or URI reference. 1508560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 1508660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * In the case of non-ascii characters, the string is encoded according to 15087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * utf-8 and then converted according to RFC 2396. 15088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Examples 1509060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true()) 15091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean" 15092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false()) 15093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean" 15094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 15096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 15097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) { 15098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 15099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int escape_reserved; 15100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 15101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cptr; 15102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar escape[4]; 1510360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 1510560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape_reserved = xmlXPathPopBoolean(ctxt); 1510760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 15109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 1511060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 1511260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[0] = '%'; 15114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[3] = 0; 1511560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 15117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cptr = str->stringval; *cptr; cptr++) { 15118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cptr >= 'A' && *cptr <= 'Z') || 15119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr >= 'a' && *cptr <= 'z') || 15120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr >= '0' && *cptr <= '9') || 1512160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *cptr == '-' || *cptr == '_' || *cptr == '.' || 15122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '!' || *cptr == '~' || *cptr == '*' || 15123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '\''|| *cptr == '(' || *cptr == ')' || 1512460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (*cptr == '%' && 15125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cptr[1] >= 'A' && cptr[1] <= 'F') || 15126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[1] >= 'a' && cptr[1] <= 'f') || 15127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[1] >= '0' && cptr[1] <= '9')) && 15128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cptr[2] >= 'A' && cptr[2] <= 'F') || 15129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[2] >= 'a' && cptr[2] <= 'f') || 15130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[2] >= '0' && cptr[2] <= '9'))) || 15131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!escape_reserved && 15132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr == ';' || *cptr == '/' || *cptr == '?' || 15133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == ':' || *cptr == '@' || *cptr == '&' || 15134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '=' || *cptr == '+' || *cptr == '$' || 15135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == ','))) { 15136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, cptr, 1); 15137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 15138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cptr >> 4) < 10) 15139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[1] = '0' + (*cptr >> 4); 15140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 15141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[1] = 'A' - 10 + (*cptr >> 4); 15142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cptr & 0xF) < 10) 15143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[2] = '0' + (*cptr & 0xF); 15144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 15145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[2] = 'A' - 10 + (*cptr & 0xF); 1514660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 15147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, &escape[0], 3); 15148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 15152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 15153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 15154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 15155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 15156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 15158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterAllFunctions: 15159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 15160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers all default XPath functions in this context 15162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 15163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 15164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt) 15165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 15166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean", 15167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction); 15168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling", 15169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCeilingFunction); 15170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count", 15171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCountFunction); 15172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat", 15173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathConcatFunction); 15174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains", 15175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContainsFunction); 15176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id", 15177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathIdFunction); 15178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false", 15179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFalseFunction); 15180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor", 15181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFloorFunction); 15182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last", 15183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLastFunction); 15184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang", 15185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLangFunction); 15186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name", 15187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLocalNameFunction); 15188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not", 15189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNotFunction); 15190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name", 15191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNameFunction); 15192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri", 15193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNamespaceURIFunction); 15194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space", 15195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNormalizeFunction); 15196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number", 15197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction); 15198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position", 15199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathPositionFunction); 15200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round", 15201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoundFunction); 15202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string", 15203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStringFunction); 15204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length", 15205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStringLengthFunction); 15206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with", 15207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStartsWithFunction); 15208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring", 15209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubstringFunction); 15210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before", 15211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubstringBeforeFunction); 15212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after", 15213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubstringAfterFunction); 15214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum", 15215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSumFunction); 15216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true", 15217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTrueFunction); 15218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate", 15219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTranslateFunction); 15220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri", 15222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions", 15223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathEscapeUriFunction); 15224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 15225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPATH_ENABLED */ 15227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xpath 15228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 15229